4

显然,当我将一个yieldin 函数体放入时。但这不是我要问的。给定交互式解释器中的两个简单函数:

def myGenerator():
    yield 42

def myFunction():
    return 42

当我执行两者时,我看到:

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

但是如果检查myGeneratorandmyFunction对象,我看不出有什么不同:

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

产生看起来与myGenerator. 函数对象的内部是否隐藏了一些神奇的位,解释器分支出来以识别是否将函数调用包装为生成器?或者它是做更多的装饰风格,yield 关键字的存在导致对象'myGenerator'被绑定在一些生成器魔法中?或者是其他东西...?

4

1 回答 1

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
于 2013-07-18T22:57:37.000 回答