経緯
Fabricを利用しているプログラムを読むと、with文で呼び出されているオブジェクトが有る。
ちょっと調べてみると、どうやら、コンテキストマネージャと呼ばれるものらしい。。
文脈(コンキテスト)を管理する者(マネージャ)とは、
Pythonでは一体何を意味し、何か嬉しいことが有るのだろうか?
よく分からず安易にコピペしてはいけないと思い、調べてみようと思った。
そもそもコンテキストマネージャとは、何か?
公式ドキュメントでは、
with文実行時にruntime contextを定義し確立させるためのオブジェクト、と説明されている。
では、runtime contextとは何だろうか?
そこで、stack overflowに記事を見つけた。
What is a “runtime context”?
__enter__()呼び出しで組み立てられて、__exit__()呼び出しで取り壊される環境、と説明されている。
この環境とは、コンテキストマネージャ自身が持つプロパティの集合を指しているのだろう。
コンテキストマネージャは必ず、特殊メソッドの__enter__()と__exit__()を定義しなければいけない約束になっている。
__enter__()と__exit__()のシグネチャは厳密に取り決められている。詳細は割愛。
何故、ガチガチに取り決められたコンテキストマネージャをわざわざ作るのか?
with文でコンテキストマネージャが呼び出されると、withブロックの直前に、
必ず__enter__()が呼び出され、
withブロックの処理が正常終了(または例外発生)したならば、
必ずコンテキストマネージャの__exit__()が呼び出される。
以上よりコンテキストマネージャを利用するメリットが見えてきた。
- 少ないコード量(特に例外処理にあたる部分)と高い可読性
- withブロックによるローカルスコープの環境(プロパティの集合)の提供
- 前処理(__enter__)と後処理(__exit__)の強制
コンテキストマネージャを自作して呼び出そう
後日記載