#
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` 文の 仕様、背景、そして実例