当我在功能体中放置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'
的对象被包裹在一些生成器魔法中?或其他什么......?
答案 0 :(得分:4)
“生成器函数在所有方面都是普通的函数对象,但在代码对象的co_flags成员中设置了新的CO_GENERATOR标志。”
从PEP http://www.python.org/dev/peps/pep-0255/
>>> generator_fn.__code__.co_flags
>>> 99
>>> normal_fn.__code__.co_flags
>>> 67