🚪
コンテキストマネージャ — with文が実際にやること
__enter__と__exit__でリソースクリーンアップを保証するプロトコル
with open('data.txt') as f:
content = f.read()
# ここでfは既に閉じている — エラーが起きても
try/finallyなしでリソースクリーンアップが保証される。これがコンテキストマネージャの核心。
内部動作
__enter__がリソースを取得、__exit__がクリーンアップ。__exit__は例外情報を引数で受け取る。Trueを返すと例外を飲み込み、Falseで再送出。
contextlib.contextmanager
Generatorベースアプローチ:yield前 = __enter__、yield後 = __exit__。generatorの「実行一時停止」特性をそのまま活用。
DBトランザクション、ロック管理
DB接続、ファイル、ソケット、スレッドロック — クリーンアップが必要なリソースにコンテキストマネージャを使えばリーク根本防止。
キーポイント
1
with obj as val: → obj.__enter__()呼び出し → 返却値をvalに代入
2
withブロック実行(正常でも例外でも)
3
obj.__exit__(exc_type, exc_val, exc_tb)呼び出し — クリーンアップ保証
4
contextlib.contextmanagerでgeneratorベースの簡単実装可能
ユースケース
ファイル/DB接続 — 開閉を保証
timer() — ブロック実行時間を自動計測