2009-09-02 11 views
309

pythonキーワード "with"は何のために使われていますか?pythonキーワード "with"は何のために使われていますか?

から例:(ファイルストリームなど)アンマネージリソースを扱う場合withキーワードが使用されているhttp://docs.python.org/tutorial/inputoutput.html Pythonで

>>> with open('/tmp/workfile', 'r') as f: 
...  read_data = f.read() 
>>> f.closed 
True 
+10

これは役に立つかもしれません:http://effbot.org/zone/python-with-statement.htm – Domenic

答えて

247

。これは、VB.NETとC#のusing文に似ています。例外がスローされた場合でも、リソースを使用するコードが実行を終了すると、リソースが "クリーンアップ"されるようにすることができます。それはtry/finallyブロックのための '構文的な砂糖'を提供します。

Python Docsから:

with文では、以前にクリーンアップコードが実行されることを保証するためにtry...finallyブロックを使用するコードを明確にしています。このセクションでは、一般的に使われるステートメントについて説明します。次のセクションでは、実装の詳細を調べ、このステートメントで使用するオブジェクトを記述する方法を示します。

with文は基本的な構成である制御フロー構造である:

with expression [as variable]: 
    with-block 

式が評価され、それはコンテキスト管理プロトコルをサポートしているオブジェクトをもたらすはずである(すなわち、__enter__()とを有しています__exit__()方法)。

更新 Scott WisniewskiのコメントごとにVBコールアウトが固定されています。私は実際にwithusingを混同していました。

+4

オープンリソースを閉じるためにどのような方法が使用されますか?独自の特別なオープン/クローズ方法を持つ独自のファイルシステムオブジェクトを作成した場合、「with」キーワードはそれらのファイルシステムと連動しますか?あるいは、 "with"は組込みのPythonリソースタイプでのみ動作しますか? – MikeN

+9

Pythonでは、カスタムオブジェクトは '__enter__'と' __exit__'メソッドを実装(または実装するものから継承)する必要があるようです。 IronPython(Pythonを使用しています。ネット)あなたはIDisposableから実装することができ、それはそれをカバーします。純粋なPythonや他のフレームワークで何が最善の方法であるか分かりません。 –

+1

FYI:これはVB.NETの "using"ステートメントを混乱させています。これはPythonの "with"ブロックのように振る舞い、VBの "with"ステートメントはまったく違うものです。以下を参照してください。http://msdn.microsoft.com/en-us/library/htd05whh.aspxおよびhttp://msdn.microsoft.com/en-us/library/wc500chb(v=vs.110).aspx –

325

Explanation from the Preshing on Programming blog

あなたが 間でのコードのブロックで、ペアとして実行したい二つの関連事業を展開しているときに便利です。古典 例では、それを閉じ、次に、ファイルを開く、ファイルを操作している:

with open('output.txt', 'w') as f: 
    f.write('Hi there!') 

上記の文では、自動的にコードの ネストされたブロックの後にファイルを閉じます。 (続きを読むと、 のクローズを正確に見ることができます)。withステートメントを使用する利点は、ネストされたブロックがどのように終了するにしてもファイルを閉じることが保証されていることです( )。 ブロックの最後の前に例外が発生すると、例外が外部例外ハンドラによってキャッチされる前に ファイルを閉じます。 ネストされたブロックにreturn文、continueまたは break文が含まれていた場合、with文はそのような場合にもファイル を自動的に閉じます。

+57

私はこれを受け入れられた答えよりもずっとよく理解していました。ありがとう。 – rayryeng

+7

私はここで例を挙げて完全な説明を見つけました:http://preshing.com/20110920/the-python-with-statement-by-example/ – praba230890

+1

すばらしい説明:) – jax

関連する問題