ジェネレータ関数から返されたジェネレータオブジェクトは、関数オブジェクトへの参照を保持していますか?換言すれば、これを行うことができmagic_fn
を実現することができる:発電機は発電機の機能について知っていますか?
>>> def gen():
... yield 1
... yield 2
...
>>> gen.attr = 'potato'
>>> g = gen()
>>> del gen
>>> next(g)
1
>>> magic_fn(g, 'attr')
'potato'
ジェネレータがコードオブジェクト(g.gi_code
)を参照し、フレーム(g.gi_frame
)、及び名前(g.__name__
)を有しています。コードオブジェクトは、gen.__code__
と同じメモリアドレスを持っています。
しかし、まだガベージコレクションされていないと仮定すると、gen.__dict__
にアクセスする方法が見つかりませんでした。それは可能ですか、または発電機が作られた直後にリンクが既に失われていますか?
ありがとう:
同様に、あなたはジェネレータイテレータは関数の
__dict__
、または任意の他の参照チェーン、それは機能の__dict__
に保存されたアイテムを取得しましょうということへの参照を保持していないことを示すことができます私はまた、「さようなら」を印刷する 'Dummy'に' __del__'を実装することによって収集されたことを知ることができました。 'weakref.ref'のこの使用法とそれがどのように機能するかについて、より多くの説明を追加できますか? – wim@wim:弱参照の説明を少し追加しました。 – user2357112