with を使うと、処理の「前」と「後」に決まった動作を自動で行えます。__enter__ が入るときに、__exit__ が抜けるときに呼ばれます。class Section:
def __enter__(self):
print('--- ここから ---')
return self
def __exit__(self, *args):
print('--- ここまで ---')
with Section():
print('中身')--- ここから --- 中身 --- ここまで --- の順に出ます。with の中身を書いていないのに、前後の行が自動で足されているのがポイントです。Timer クラスに2つのメソッドを追加します。__enter__(引数は self だけ)… 「開始」と表示し、最後に self を return する__exit__(引数は self と *args)… 「終了」と表示するwith Timer(): と print('処理中...') は書いてあるので、開始 → 処理中... → 終了の順に出ればOKwith open(...))、DB接続、ロックの解放、処理時間の計測など。__exit__ は途中でエラーが起きても必ず呼ばれるので、閉じ忘れ・解放し忘れを防げます。__enter__ が始め、__exit__ が終わりに呼ばれるwith ブロックを抜けると自動で __exit__ が動く開始 処理中... 終了
全問正解でクエストクリア!
問題 1: contextlib.contextmanager で「→ 処理前」「→ 処理中」「→ 処理後」と表示しよう!
問題 2: ManagedList クラスに __enter__(空リスト返す)と __exit__(長さ表示)を実装しよう!
問題 3: with文 で StringIO に 'Hello' を書いて読み取って表示しよう!