我被困在python2.4上,所以我不能在生成器或yield
中使用finally子句。有什么办法可以解决这个问题吗?解决方法python 2.4的yield不允许在try子句中用finally子句
我找不到任何提及如何解决这个限制在Python 2.4中,我不是我想到的解决方法的大粉丝(主要涉及__del__
,并试图确保它在内部运行一段合理的时间)并不很吸引人。
我被困在python2.4上,所以我不能在生成器或yield
中使用finally子句。有什么办法可以解决这个问题吗?解决方法python 2.4的yield不允许在try子句中用finally子句
我找不到任何提及如何解决这个限制在Python 2.4中,我不是我想到的解决方法的大粉丝(主要涉及__del__
,并试图确保它在内部运行一段合理的时间)并不很吸引人。
您可以复制代码,以避免finally块:
try:
yield 42
finally:
do_something()
变为:
try:
yield 42
except: # bare except, catches *anything*
do_something()
raise # re-raise same exception
do_something()
(我不是在Python 2.4中尝试这样做,你可能看sys.exc_info而不是上面的re-raise声明,如raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2]
。)
唯一的代码保证在简单地放弃生成器实例时调用(垃圾代码llected)是其局部变量的__del__
方法(如果外部不存在对这些对象的引用)以及对其局部变量(同上)的弱引用的回调。我建议使用弱参考路线,因为它是非侵入性的(你不需要特殊的课程和__del__
- 只是任何弱引用的课程)。例如:
import weakref
def gen():
x = set()
def finis(*_):
print 'finis!'
y = weakref.ref(x, finis)
for i in range(99):
yield i
for i in gen():
if i>5: break
这根据需要打印finis!
。