Если функция содержит yield
в любом месте в теле, это функция генератора.Неважно, выполняется yield
или нет.Тот факт, что 1 == 2
имеет значение false, не имеет к этому никакого отношения.
Рассмотрим следующую функцию:
def addone(numbers):
for number in numbers:
yield number + 1
Что происходит при вызове addone([])
?yield
никогда не выполняется, и все же addone
по-прежнему возвращает генератор.Почему это должно быть иначе:
def addone(numbers):
if numbers:
for number in numbers:
yield number + 1
Таким образом, становится ясно, что фактическое выполнение yield
не имеет значения.Единственный релевантный факт - существует ли yield
в теле функции.
Как исправить функцию
Исправление относительно простое, все, что вам нужно сделать, это потянуть частьс yield
в отдельную функцию:
import types
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if isinstance(result, types.GeneratorType):
print("Is a generator")
return wrap_generator(result)
print("Not a generator")
return result
def wrap_generator(gen):
for item in gen:
print(item)
yield item
Как избежать в будущем
В общем, проблема здесь в том, что функция является либо генератором (и использует yield
) или является нормальной функцией (и использует return
).Это немного сбивает с толку, когда вы используете yield
и return
в одной и той же функции!
Для Python получается, что если вы используете и 1035 *, и return
в одной и той же функции,функция является функцией генератора.Это может несколько сбивать с толку, поэтому из соображений стиля я бы обычно избегал использования return
и yield
в одной и той же функции.