目次
概要
- Pythonにはコンテキストマネージャというものがあります。
- これは一般的にはリソースの開閉(
open
、close
)を伴う処理で、開き忘れや閉じ忘れがないようサポートしてくれる機能になります。 - Javaでいうところの
AutoCloseable
みたいなものです。 - 定義するにはクラスを定義する際に、
__enter__
メソッドと__exit__
メソッドを実装します。 - コンテキストマネージャが生成されるとき、
__enter__
が呼ばれ、withブロック
で定義されたコンテキストから抜けるときに__exit__
メソッドが呼ばれます。 - 裏で例外処理
try-except-finally
を利用しており、コンテキストから抜けるときに__exit__
メソッドが確実に呼ばれます。
実装方法
- 基本的には、
__enter__
メソッドと、__exit__
メソッドを定義するだけです。 __exit__
メソッドのexc_type
,exc_value
,traceback
は、コンテキスト内で例外が発生した場合に渡されます。- 例外が発生していないときは
None
です。
- 例外が発生していないときは
__enter__
メソッドでreturn
しているself
が、withブロック
でas
として受け取った変数となります。
class MyContextManager: def __enter__(self): print('1 ENTER!') return self def __exit__(self, exc_type, exc_value, traceback): print('4 EXIT!') def foo(self): print('3 FOO!') # テストプログラム with MyContextManager() as cm: print('2 ** hello **') cm.foo()
出力結果
1 ENTER! 2 ** hello ** 3 FOO! 4 EXIT!