次のようにすると、Python でスコープ外になるとファイルハンドルは自動的に閉じられますか?
def read_contents(file_path):
return file(file_path).read()
そうでない場合、スコープを自動的に閉じるこの関数をどのように記述すればよいでしょうか?
ベストアンサー1
FogleBird の回答を詳しく説明すると、明示的に閉じない場合、ファイル オブジェクトが破棄されると、ファイルは自動的に閉じられます。CPython では、参照がなくなるとすぐにこれが起こります。たとえば、関数内のローカル変数で関数が終了する場合などです。ただし、関数内で例外がスローされ、ステートメントまたはを使用してファイルが明示的に閉じられていない場合、with
ファイルtry:...finally:
への参照はトレースバック オブジェクトのスタック トレースの一部として保持され、少なくとも次の例外がスローされるまではファイルは閉じられません。
また、IronPython と Jython はそれぞれ .Net CLR と Java JVM のガベージ コレクション機能を使用します。これらは参照カウントされないため、ガベージ コレクターがオブジェクトのメモリを再利用することを決定するか、プログラムが終了するまで、ファイルは無期限に開いたままになります。
with:
したがって、一般的には、またはのいずれかを使用してファイルを明示的に閉じることが重要ですtry:...finally:
。
もちろん、これは明示的なクリーンアップを必要とする他の種類のオブジェクトにも当てはまります。