例如,你如何在一個已經迭代的發電機中捕獲GeneratorExit?
In [33]: def gener():
...: try:
...: print('hi')
...: yield 1
...: print('hi 2')
...: yield 2
...: except:
...: print('Closed: {!r}'.format(sys.exc_info()[1]))
...:
In [34]: gener().close()
# ↑ No output!
In [35]: g = gener()
In [36]: next(g)
hi
Out[36]: 1
In [37]: g.close()
Closed: GeneratorExit()
是沒可能注意到發電機的close()
電話,如果你還沒有跨進發生器,在Python?
(在我的實際使用情況,的參數傳遞給發電機一個是返回發電機的功能傳遞給發電機,包括所有權。即資源,
def do_it():
resource = acquire()
try:
return a_generator(resource)() # pass ownership of the resource
except:
resource.close()
如果您在第一次迭代之前關閉發生器,並且發生器無法捕獲該事實,則資源泄漏)。
你可以寫一個基於類發生器和覆蓋close方法。 –