関数本体に入れるとyield
、明らかに。しかし、それは私が尋ねようとしていることではありません。対話型インタープリターで 2 つの単純な関数が与えられた場合:
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'
、ジェネレーター マジックでラップされる、より多くのデコレーター スタイルで行われますか? または、他の何か...?