メソッドが終了したときに、パラメータとしてメソッドを呼び出し、解放のリソースではなく、__exit__
が呼び出されると、この1行のコードでは?パラメータを使用するときに__exit__が呼び出されますか?
hashlib.md5(open("PATH", 'rb').read()).hexdigest()
「不適切なリソースの解放」について発行することはできますか?
メソッドが終了したときに、パラメータとしてメソッドを呼び出し、解放のリソースではなく、__exit__
が呼び出されると、この1行のコードでは?パラメータを使用するときに__exit__が呼び出されますか?
hashlib.md5(open("PATH", 'rb').read()).hexdigest()
「不適切なリソースの解放」について発行することはできますか?
__exit__
は呼び出されず、の末尾に__exit__
がトリガーされます。
CPythonでは、このファイルオブジェクトへの参照がもうなくなり、it will close the fileになると、最終的にトリガーされます。
with-statement
を使用して、close()
の呼び出しが明示的でないことを確認し、実装の詳細に頼らないようにすることをおすすめします。
with open("PATH", 'rb') as f:
hash = hashlib.md5(f.read()).hexdigest()
あなたは、包括的な説明はパイソンdata models documentationでこれを考える見つけることができます:
一部のオブジェクトは、開いているファイルやウィンドウなどの「外部」リソースへの参照が含まれています。これらのリソースは、オブジェクトがガベージコレクションされるときに解放されますが、ガーベジコレクションが行われることが保証されていないため、外部リソースを解放する明示的な方法(通常は
close()
メソッド)も提供されます。このようなオブジェクトを明示的に閉じるには、プログラムを強くお勧めします。try...finally
ステートメントとwith
ステートメントは、これを行う便利な方法を提供します。
開かれたオブジェクトのclose
属性を呼び出さないため、開かれたオブジェクトは閉じられません。あなたが明示的にクローズを呼び出さない場合は、with
文の中で、あなたのコードをラップする必要があります
with open("PATH", 'rb') as f:
hashlib.md5(f.read()).hexdigest()
コンテキストマネージャは、それがのcloseメソッドを呼び出しますブロックの終了時に自動的__exit__
メソッドを呼び出します。これにより結果としてあなたのファイルオブジェクト。
いいえ、 '__exit__'メソッドは呼び出されません – mic4ael