Pythonのwith文とコンテキストマネージャは、リソースの管理に非常に便利なツールです。特に、@contextlib.contextmanagerデコレータとyieldキーワードを組み合わせることで、独自のコンテキストマネージャを簡単に作成できます。
コンテキストマネージャとは何か
コンテキストマネージャは、with文に渡されるオブジェクトのことを指します。このオブジェクトは__enter__と__exit__の2つのメソッドを持つ必要があります。__enter__メソッドはwithブロックの前処理を行い、__exit__メソッドは後処理を行います。
class Reading:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.file = open(self.filename, 'r')
return self.file
def __exit__(self, type, value, traceback):
self.file.close()
しかし、毎回このようなクラスを定義するのは面倒です。そこで、@contextlib.contextmanagerデコレータが役立ちます。
@contextlib.contextmanagerとyield
@contextlib.contextmanagerは、yieldキーワードを使ってコンテキストマネージャを簡単に定義できるデコレータです。このデコレータを使うと、上記のReadingクラスは次のように書き換えることができます。
import contextlib
@contextlib.contextmanager
def reading(filename):
file = open(filename, 'r')
try:
yield file
finally:
file.close()
このコードでは、yieldの前にファイルを開く処理(前処理)を、yieldの後にファイルを閉じる処理(後処理)を書いています。yieldはジェネレータの一部であり、yieldの位置でジェネレータ(ここではreading関数)が一時停止します。そのため、yieldの前後に前処理と後処理を書くことで、with文の前後でそれぞれの処理を実行することができます。
以上が、Pythonのコンテキストマネージャとyieldの基本的な使い方です。これらの機能を活用することで、リソースの管理をより簡単に、より安全に行うことができます。