2017-04-03 9 views
0

メソッドが終了したときに、パラメータとしてメソッドを呼び出し、解放のリソースではなく、__exit__が呼び出されると、この1行のコードでは?パラメータを使用するときに__exit__が呼び出されますか?

hashlib.md5(open("PATH", 'rb').read()).hexdigest() 

「不適切なリソースの解放」について発行することはできますか?

+0

いいえ、 '__exit__'メソッドは呼び出されません – mic4ael

答えて

3

__exit__は呼び出されず、の末尾に__exit__がトリガーされます。

CPythonでは、このファイルオブジェクトへの参照がもうなくなり、it will close the fileになると、最終的にトリガーされます。

with-statementを使用して、close()の呼び出しが明示的でないことを確認し、実装の詳細に頼らないようにすることをおすすめします。

with open("PATH", 'rb') as f: 
    hash = hashlib.md5(f.read()).hexdigest() 
1

あなたは、包括的な説明はパイソンdata models documentationでこれを考える見つけることができます:

一部のオブジェクトは、開いているファイルやウィンドウなどの「外部」リソースへの参照が含まれています。これらのリソースは、オブジェクトがガベージコレクションされるときに解放されますが、ガーベジコレクションが行われることが保証されていないため、外部リソースを解放する明示的な方法(通常はclose()メソッド)も提供されます。このようなオブジェクトを明示的に閉じるには、プログラムを強くお勧めします。 try...finallyステートメントとwithステートメントは、これを行う便利な方法を提供します。

開かれたオブジェクトのclose属性を呼び出さないため、開かれたオブジェクトは閉じられません。あなたが明示的にクローズを呼び出さない場合は、with文の中で、あなたのコードをラップする必要があります

with open("PATH", 'rb') as f: 
    hashlib.md5(f.read()).hexdigest() 

コンテキストマネージャは、それがのcloseメソッドを呼び出しますブロックの終了時に自動的__exit__メソッドを呼び出します。これにより結果としてあなたのファイルオブジェクト。

関連する問題