LoginSignup
5
7

More than 5 years have passed since last update.

Pythonのコンテキストマネージャは何が嬉しいのか?

Last updated at Posted at 2016-12-24

経緯

Fabric コンテキストマネージャー

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__)の強制

コンテキストマネージャを自作して呼び出そう

後日記載

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7