ヒトリ歩き

愚痴とかいろいろ書きます

コンテキストマネージャの使い方とは?

はじめに

ロバストPythonでコンテキストマネージャが出てきたので、使い方を簡単に整理する。
コンテキストマネージャが使えるか使えないかがPython初級者と中級者との差かな・・・。

使い所はどこ?

ファイルのオープン/クローズや、データベースの実行成功時のコミット、失敗時のロールバックなど、何かの操作後に実行しなければいけない処理がある場合にコンテキストマネージャを活用する。
テストでもクリーンアップの処理が必要なテスト向けにコンテキストマネージャを使って実装するとよい。

どうやって実装するのか?

@contextmanager を使用すればよい。
関数に@contextmanager を付与だけで、その関数はコンテキストマネージャになる。
関数は、必ず値を1つyieldしなければならない。asの後の変数にyieldをした値が格納される。

from contextlib import contextmanager

@contextmanager
def sample_context_mng():
    print("Start sample_context_mng")
    try:
        print("Call yield")
        yield "hoge"
    finally:
        print("Finally")

with sample_context_mng():
    print("Start!!")

print("End!!")

実行した結果は以下のとおり。
デコレート対象の関数が実行され、yieldを実行した箇所からwith文のネストされたブロックの処理が実行されていることがわかる。

Start sample_context_mng
Call yield
Start!!
Value = hoge
Finally
End!!

さいごに

コンテキストマネージャを使いこなすのが、初級者と中級者の境目になるのではないかと考える。
自分は、コンテキストマネージャをうまく使いこなせていない。
中級者や上級者になる上でPythonのこれは使いこなせないとダメだよというものがあれば教えてもらいたい。
意識してコンテキストマネージャを使いこなしていこうと思う。

補足

コンテキストマネージャのドキュメントを見ると非同期用のコンテキストマネージャもある。

docs.python.org