gpt4 book ai didi

python - 生成器知道生成器函数吗?

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:21 26 4
gpt4 key购买 nike

从生成器函数返回的生成器对象是否包含对函数对象的引用?换句话说,是否有可能实现可以执行此操作的 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__ 的方法。是否可能,或者在创建生成器后链接是否已经丢失?

最佳答案

生成器迭代器不引用生成器函数。您可以通过使用 weakref.ref 保持对该函数的弱引用来看到这一点。 :

>>> import weakref
>>> def gen():
... yield 1
...
>>> ref = weakref.ref(gen)
>>> gen_iter = gen()
>>> del gen
>>> ref() is None
True

与普通引用不同,weakref.ref 不会延迟对其引用内容的收集。如果指示对象 (gen) 仍然存在,则 ref() 将是 gen。如果已收集指示对象,则 ref()None。如您所见,weakref 已被清除,如果 gen_iter 仍具有对 gen 的引用,则不会发生这种情况。

类似地,您可以证明生成器迭代器不保留对函数的 __dict__ 的引用,或任何其他允许它检索存储在函数的 中的项目的引用链__dict__:

>>> class Dummy(object):
... pass
...
>>> def gen():
... yield 1
...
>>> gen.attr = Dummy()
>>> ref = weakref.ref(gen.attr)
>>> gen_iter = gen()
>>> del gen
>>> ref() is None
True

关于python - 生成器知道生成器函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com