7.5 with

バージョン 2.5 で 新たに追加 された仕様です。

with 文は、ブロックの実行を、コンテキストマネージャによって定義された メソッドでラップするために使われます( 3.4.9 セクションを 参照してください)。これにより、よくある try...except...finally 利用パターンを カプセル化して便利に再利用することができます。

with_stmt ::= "with" expression ["as" target] ":" suite
Download entire grammar as text.

with 文の実行は以下のように進行します:

  1. コンテキスト式を評価し、コンテキストマネージャを取得します。

  2. コンテキストマネージャの __enter__() メソッドが呼ばれます。

  3. ターゲットが with 文に含まれる場合、 __enter__() からの戻り値がこれに代入されます。

    注意: with 文は、__enter__() メソッドがエラーなく 終了した場合には __exit__() が常に呼ばれることを保証します。ですので、もしエラーが ターゲットリストへの代入中にエラーが発生した場合には、これは そのスイートの中で発生したエラーと同じように扱われます。

  4. スイートが実行されます。

  5. コンテキストマネージャの __exit__() メソッドが呼ばれます。もし 例外がスイートを終了させる場合、その型、値、そして トレースバックが __exit__() へ引数として渡されます。そうでなければ、 3 つの None 引数が与えられます。

    スイートが例外により終了した場合、 __exit__() メソッドからの戻り値は偽(false)であり、例外が 再送出されます。この戻り値が真(true)ならば例外は抑制され、そして 実行は with 文に続く分へ継続されます。

    もしそのスイートが例外でない何らかの理由で終了した場合、その __exit__() からの戻り値は無視されて、実行は 発生した終了の種類に応じた通常の位置から継続します。

注意: Python 2.5 では、with 文は with_statement 機能が有効に された場合にだけ許可されます。これは Python 2.6 では常に有効になります。__future__ インポート文が この機能を有効にするために利用できます:

from __future__ import with_statement

参考:

PEP 0343, The "with" statement
Python の with 文の 仕様、背景、そして実例

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。