4

関数本体に入れるとyield、明らかに。しかし、それは私が尋ねようとしていることではありません。対話型インタープリターで 2 つの単純な関数が与えられた場合:

def myGenerator():
    yield 42

def myFunction():
    return 42

両方を実行すると、次のように表示されます。

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

しかし、myGeneratormyFunctionオブジェクトを調べると、実際に異なるものは何も表示されません。

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 に答える