14

python の with...as ステートメントに依存することが安全または適切な方法と見なされるかどうか、興味があります。たとえば、ファイルを開くとき:

with open("myfile","w") as myFile:
    #do something

したがって、この例では明示的に呼び出すことを怠っていましたが、Python がオブジェクトメソッドを呼び出してステートメントをmyFile.close()終了したときに呼び出されたと想定できます。これに依存することは良い習慣/安全ですか、それとも常に明示的に呼び出す方が良いでしょうかwith...as__exit__()file.close()

4

2 に答える 2

20

これは、ファイルを閉じるためにコンテキストマネージャーに依存するためのものです。例外が発生した場合でも、コンテキスト マネージャーが呼び出されます。

finally別の方法は、代わりにブロックを使用することです。

myFile = open("myfile","w")
try:
    # do something with myFile
finally:
    myFile.close()

しかし、 内のブロックtry:が長い可能性があるため、finallyステートメントにたどり着くまでに、これを何のために設定していたかを忘れてしまいます。

コンテキスト マネージャーはさらに強力です。メソッドには例外が通知されるため、__exit__例外ハンドラーとしても機能できます (例外を無視する、別の例外を発生させるなど)。

于 2013-02-08T16:18:34.250 に答える
4

はい、withステートメントはより良い方法です。Python 2.5以降、ファイルオブジェクトにはメソッドが装備されてい__enter__()ます__exit__()。この__exit__()メソッドはファイルオブジェクトを閉じます。

Pythonはメソッドを呼び出すことを保証しますが、特にサードパーティのコードを使用し__exit__()て、メソッドがリソースを閉じることを保証するものではありません。__exit__()手動で確認する必要があります。

于 2013-02-08T16:31:32.390 に答える