Python 2.4の利回りの回避策は、最終的に句でトライブロックで許可されていません

StackOverflow https://stackoverflow.com/questions/2339358

質問

私は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でこれを試したことはありません。 再作成します 上記の声明、ように raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2].)

他のヒント

発電機インスタンスが単に放棄されたときに呼び出されることが保証されている唯一のコード(収集されたガベージ)は __del__ そのローカル変数の方法(外側にこれらのオブジェクトへの参照がない場合)およびそのローカル変数への弱い参照のコールバック(DITTO)。侵襲的でないため、弱い参照ルートをお勧めします(特別なクラスは必要ありません __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