ファイルを閉じずに開いた場合、ファイルがリークすることを常に想定していましたが、次のコード行を入力すると、ファイルが閉じられることを確認しました。
>>> f = open('somefile.txt')
>>> del f
純粋な好奇心から、これはどのように機能するのでしょうか? __
ファイルにdel__
メソッドが含まれていないことに気付きました。
ファイルを閉じずに開いた場合、ファイルがリークすることを常に想定していましたが、次のコード行を入力すると、ファイルが閉じられることを確認しました。
>>> f = open('somefile.txt')
>>> del f
純粋な好奇心から、これはどのように機能するのでしょうか? __
ファイルにdel__
メソッドが含まれていないことに気付きました。
少なくとも CPython では、ファイル オブジェクトの割り当てが解除されると、ファイルは閉じられます。CPython ソースのfile_dealloc
関数を参照してください。Objects/fileobject.c
割り当て解除メソッドは__del__
、C 型の場合と似ていますが、に固有の問題がいくつかありません__del__
。
したがって、withステートメント。
Python 2.5 の場合は、
from __future__ import with_statement
(Python 2.6 または 3.x の場合、何もしません)
with open( "someFile", "rU" ) as aFile:
# process the file
pass
# At this point, the file was closed by the with statement.
# Bonus, it's also out of scope of the with statement,
# and eligible for GC.
Python は、ガベージ コレクションに加えて、参照カウントと決定論的破棄を使用します。オブジェクトへの参照がなくなると、オブジェクトはすぐに解放されます。ファイルを解放すると、ファイルが閉じます。
これは、非決定論的なガベージ コレクションしかない Java などとは異なります。これは、オブジェクトがいつ解放されるかわからないことを意味するため、手動でファイルを閉じる必要があります。
参照カウントは完全ではないことに注意してください。プログラムから到達できない循環参照を持つオブジェクトを持つことができます。そのため、Python には参照カウントに加えてガベージ コレクションがあります。
ファイルの種類が組み込み型であるため、インタープリター自体がガベージ コレクションでファイルを閉じる処理を行っていると推測できます。
または、Python インタープリターが終了した後にのみチェックし、「リークされた」ファイルハンドルはすべて閉じられます。