python 2.4的解决方案在尝试块中不允许使用最终条款
-
22-09-2019 - |
题
我卡在python2.4上,所以我不能最终与发电机或 yield
. 。有什么方法可以解决这个问题吗?
我找不到任何关于如何在Python 2.4中解决此限制的事情的提及,而我并不是我想到的解决方法的忠实拥护者(主要涉及 __del__
并试图确保它在合理的时间内运行)不是很吸引人。
解决方案
您可以复制代码以避免最终阻止:
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而不是 重新调整 上面的声明,如 raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2]
.)
其他提示
简单地放弃发电机实例(收集垃圾)时,保证的代码是 __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!
, , 如预期的。
不隶属于 StackOverflow