Python Languageコンテキストマネージャ( "with"ステートメント)


前書き

Pythonのコンテキストマネージャは広く使用されていますが、その使用目的の背後にある目的を理解する人はほとんどいません。ファイルの読み書きによく使用されるこれらのステートメントは、システムメモリを節約し、特定のリソースが特定のプロセスでのみ使用されていることを保証することによってリソース管理を向上させます。このトピックでは、Pythonのコンテキストマネージャーの使い方を説明しています。

構文

  • "context_manager"( "エイリアス"として)(、 "context_manager"( "エイリアス"として)?)*:

備考

コンテキストマネージャは、 PEP 343で定義されています。それらは、リソース管理のためのより簡潔なメカニズムとして、 try ... finally構築するtry ... finallyよりも使用されることが意図されています。正式な定義は以下の通りです。

このPEPでは、コンテキストマネージャは、 __enter__()および__exit__()メソッドを提供しています。 __enter__()メソッドは、with文の本体への__exit__()時に呼び出されます。

次に、 withステートメントを次のように定義します。

with EXPR as VAR:
    BLOCK

上記の声明の翻訳は:

   mgr = (EXPR)
   exit = type(mgr).__exit__  # Not calling it yet
   value = type(mgr).__enter__(mgr)
   exc = True
   try:
       try:
           VAR = value  # Only if "as VAR" is present
           BLOCK
       except:
           # The exceptional case is handled here
           exc = False
           if not exit(mgr, *sys.exc_info()):
               raise
           # The exception is swallowed if exit() returns true
   finally:
       # The normal and non-local-goto cases are handled here
       if exc:
           exit(mgr, None, None, None)

コンテキストマネージャ( "with"ステートメント) 関連する例