2013-02-14 6 views
6

標準スレッドライブラリ(Python 2.6)のコードの一部を読んでいて、私に不思議に思ったコードがありました。これらの変数はfooスコープの外に行かないPython標準ライブラリでの変数の削除

def foo(): 
    exc_type, exc_value, exc_tb = sys.exc_info() 
    try: 
     # some code 
    except: 
     # some code 
    finally: 
     del exc_type, exc_value, exc_tb 

:次の構造(threading.pyに__bootstrap_inner方式と比較)に短縮することができます。これらの参照を最後に削除する理由はありますか?

答えて

8

はい、最低でもexc_tbです。トレースバックオブジェクトは現在のフレームへの参照を保持し、これはこれを循環参照にします。

ローカル参照を削除すると、そのサークルが破損するため、ガベージコレクタができることを期待したり信頼したりする必要はありません。 sys.exc_info() function docsから

警告:循環参照が発生します例外を処理している関数内でローカル変数へのトレースバックの戻り値を割り当てます。これにより、同じ関数内のローカル変数またはトレースバックによって参照されるものがガベージコレクションされないようになります。ほとんどの関数はトレースバックにアクセスする必要がないため、例外タイプと値のみを抽出するには、exctype, value = sys.exc_info()[:2]のようなものを使用することをお勧めします。トレースバックが必要な場合は、使用後に削除することをお勧めします(try ... finally文)、または例外を処理しない関数でexc_info()を呼び出してください。

+0

ああ、わかります。どういうわけか私はそれをドキュメントで逃してしまった。ありがとうございました! – freakish

関連する問題