Глупав въпрос за *args

  1. Хм, абе чета документацията, експериментирам и стигам все до един и същи извод, ама все пак да си питам, да не би да пропускам нещо :)

    Накратко: възможно ли е на функция, която приема неопределен брой позиционни аргументи с *identifier, да й бъде подаден генератор и той да не бъде оценен по време на извикването на функцията, а чак при изпълнението й, когато тя си поиска?

    В документацията - http://docs.python.org/py3k/reference/expressions.html#calls - като че ли изрично си пише, че "...that formal parameter receives a tuple...", което ми звучи като "генераторът бива викан, докато върне StopIteration, и резултатът се събира в tuple с фиксиран размер" - вярно ли е и има ли начин това да бъде избегнато? :)

    Пример:

    def foo(a, b, *args):
        print("a is {0} b is {1}".format(a, b))
        i = iter(args) # мдам, щом ми се налага да правя това, значи вероятно не може :)
        a = next(i)
        if a > 0:
            print("- first arg {0} positive".format(a))
        else:
            print("- first arg {0} negative, next {1}".format(a, next(i)))
    
    def gen():
        i = 0
        while i < 5:
            i += 1
            yield i
    
    foo(1, 2, 3)
    foo(1, 2, -1, 4)
    foo(*gen())
    

    Така написано, това работи. Въпросът ми е може ли да се направи така, че да продължи да работи, без да "заспива", ако в gen() заменим while i < 5 с while True.

    ...и преди Стефан да ме е попитал, единствената причина да ми хрумне това беше, че се замислих дали в шестата задача е безопасно да викаме len() върху списъка с аргументи, подаден на методите при извикването им, или има опасност някой да ни подаде там нещо безкрайно.

    Публикувано преди
  2. Ба.

    Иначе, аз не виждам начин това да стане. Бих викал len() спокойно.

    Публикувано преди

Трябва да сте влезли в системата, за да може да отговаряте на теми.