我卡在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!, , 如预期的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top