【发布时间】:2017-05-16 01:30:39
【问题描述】:
我有一个生成器,即使它从未迭代过,它也必须执行清理步骤:
def gen(data):
while True:
item = data.get()
if item is None:
break
# ...
try:
yield transformed_item
except GeneratorExit:
break
# clean up; must happen if gen was called
# ...
当我这样称呼它时,一切正常(即清理发生):
for x in gen(data):
# ...
或者像这样:
g = gen(data)
r = next(g)
# ...
但是当生成器超出范围而没有任何人对其调用 next 时,当然它根本不会执行任何代码,因此 GeneratorExit 不会在其中引发,并且清理不会发生:
g = gen(data)
# g was never used before going out of scope
del g
即使生成器在有机会产生任何东西之前就超出范围,我如何重构代码以确保执行清理步骤?
【问题讨论】:
-
你应该能够覆盖你的生成器上的
__del__()方法来处理这个问题。不是很漂亮,但是会在对象被销毁的时候调用。
标签: python python-3.x garbage-collection generator