🚪

コンテキストマネージャ — 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() — ブロック実行時間を自動計測