Неожиданный расход генератора внутри функции с выходом - PullRequest
0 голосов
/ 01 июля 2019

У меня есть эта функция f1 (gen, s), которую я хочу использовать переданный генератор gen, если s положительный, и просто вернуть его без обработки, если s отрицательный.

def f1(gen, s):
    if s > 0:
        # Additional processing
        while True:
            print('consuming iterator')
            yield next(gen)
    else:
        return gen

print(len(list(f1(range(3), -1))))

Output: 0  

Часть, которая не работает, это другая часть, которая возвращает пустой генератор из-за yield next (gen) в первой части оператора if.
Если я закомментирую это в функции f, я получу нужные объекты из другой части:

def f(gen, s):
    if s > 0:
        # Additional processing
        while True:
            print('consuming iterator')
            # yield next(gen)
    else:
        return gen

print(len(list(f(range(3), -1))))

Output :3

Мой вопрос: почему выход в части, которая не должна быть выполнена в этом сценарии, потребляет генератор gen?
И как это исправить?

...