5

次のコードのテストについて、これについて質問があります。

1、

def file_close_test():
    f = open('/tmp/test', 'w+')

if __name__ == '__main__':
    file_close_test()
    # wait to see whether file closed.
    import time
    time.sleep(30)

2、

def file_close_on_exc_test():
    f = open('/tmp/test', 'w+')
    raise Exception()

def exception_wrapper():
    try:
        file_close_on_exc_test()
    except:
        pass
    # wait to see whether file closed.
    import time
    time.sleep(10)

if __name__ == '__main__':
    exception_wrapper()
    import time
    time.sleep(30)
  1. file_close_testが終了すると、ファイルオブジェクトへの参照がないため、ファイルオブジェクトが閉じられました。
  2. 例外が発生した後、ファイルオブジェクトが閉じられていないため、関連するスタックデータが解放されていないと思います。
  3. exception_wrapperの終了後、ファイルは自動的に閉じられました。

これを説明してもらえますか?ありがとう。

4

1 に答える 1

3

例外には、例外がスローされたときにアクティブなスタック フレームのすべてのローカル変数にアクセスするために使用できる traceback オブジェクトが含まれます。つまり、例外コンテキストがクリアされるまで、引き続きファイルにアクセスできます。

sleep()最後に、次のように開いているファイルを取得するためにexception_wrapper使用できます。sys.exc_info

tb = sys.exc_info()[2]
print tb.tb_next.tb_frame.f_locals['f']

もちろん、これはすべて、使用している特定の Python 実装に固有のものです。他の実装では、ガベージ コレクションが実行されるまで、暗黙的にファイルをまったく閉じない場合があります。

肝心なのは、開いているファイルなどのリソースをクリーンアップするために Python の参照カウントやガベージ コレクションに依存するべきではなく、常に明示的に行うことです。

于 2012-05-29T11:12:27.600 に答える