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でこれを試したことはありません。 再作成します 上記の声明、ように 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!
, 、 望んだ通りに。
所属していません StackOverflow