2013-07-18 3 views
4

Когда я положил yield в тело функции, очевидно. Но это не то, что я пытаюсь спросить. Учитывая две простые функции в интерактивном режиме интерпретатора:Как питон знает, когда нужно вернуть генератор?

def myGenerator(): 
    yield 42 

def myFunction(): 
    return 42 

Когда я исполняю как я вижу:

>>> myGenerator() 
<generator object myGenerator at 0xb7bf511c> 
>>> myFunction() 
42 

Но если проверить myGenerator и myFunction объекты, я не вижу ничего, на самом деле разные:

for attr in dir(myFunction): 
    print(attr, getattr(myFunction, attr) 

производит материал, который выглядит так же, как myGenerator. Есть ли какой-то волшебный бит, скрытый в недрах функционального объекта, который интерпретатор отделяет, чтобы определить, следует ли завершать вызов функции в качестве генератора? Или это сделано больше стиля декоратора, где наличие ключевого слова yield привело к тому, что объект был связан как 'myGenerator', который был обернут в какую-нибудь магию генератора? Или что-то другое...?

+2

ответа здесь: http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained – manji

ответ

4

«Функция генератора является обычным функциональным объектом во всех отношениях, но имеет новый флаг CO_GENERATOR, установленный в члене co_flags объекта кода».

Из PEP http://www.python.org/dev/peps/pep-0255/

>>> generator_fn.__code__.co_flags 
>>> 99 
>>> normal_fn.__code__.co_flags 
>>> 67 
Смежные вопросы