Хм, абе чета документацията, експериментирам и стигам все до един и същи извод, ама все пак да си питам, да не би да пропускам нещо :)
Накратко: възможно ли е на функция, която приема неопределен брой позиционни аргументи с *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() върху списъка с аргументи, подаден на методите при извикването им, или има опасност някой да ни подаде там нещо безкрайно.