
267
7.6 ディスクリプタ
class SpamRestaurant:
spam = ham = 0
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
print('Spam: {0.spam}, Ham: {0.ham}'.format(self))
def order(self, spam, ham):
self.spam += spam
self.ham += ham
with SpamRestaurant() as restaurant:
restaurant.order(spam=1, ham=1)
restaurant.order(spam=1, ham=1)
7.5.1
contextlib.contextmanager( )
標準モジュール
contextlib
の
contextlib.contextmanager()
を使うと、ジェネレータ関数を利
用して簡単にコンテキストマネージャを実装できます。
contextlib.contextmanager()
は、ジェネレータ関数のデコレータとして指定すると、ジェネ
レータの
yield
式までをコンテキストマネージャの前処理として実行し、
yield
式の後を後処理と
して実行します。
yield
式に指定した値は、
with
文の
as
節
で指定した変数に代入されます。実行
中に例外が発生した場合は、例外はジェネレータ内へ
throw( ...