2013-02-08 11 views
12

pythonのwith ... as文に依存することは安全か良いかと考えられているのでしょうか。だから、Pythonはオブジェクトに__exit__()メソッドを呼び出すことによってwith...as声明を終了したとき、私はそれが呼び出されたと仮定することができますが、明示的にmyFile.close()を呼び出すために無視この例ではpythonの... with文に依存することは良い習慣ですか?

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

:たとえば、ファイルを開くとき。それは良い習慣/これに依存しても安全か、常に明示的にこれはあなたのためのファイルを閉じるにはそれらに依存する、コンテキストマネージャはためあるものですfile.close()

+0

あなたのサンプルコードは、書き込み用に開かれたファイルから読み込もうとしましたか? – geoffspear

+0

おっと、すぐに簡単な例を書いて、今すぐ修正しました。 – Blaine

答えて

17

を呼び出す方が良いでしょうです。コンテキストマネージャは、例外があっても呼び出されます。

の代替ではなく、finallyブロックを使用することです:

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

が、try:の内部ブロックは、あなたがこれを設定し、どのようなあなたが忘れてしまったfinally声明に着くまでに、長くなる可能性があるため〜のために。

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

4

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

Pythonは__exit__()メソッドを呼び出すことを保証しますが、__exit__()メソッドが特に第三者コードでリソースを閉じる保証はありません。手動で確認する必要があります。

関連する問題