L03 ch02 — match-case (構造的パターンマッチ)
テクノロジ系 / L03 conditional — 条件分岐
L03 ch02 — match-case (構造的パターンマッチ)
if/elif の連鎖を読みやすく置き換える Python 3.10+ の構文
ゴール
match/caseで値を分岐できる- ワイルドカード
_で「それ以外」を扱える ifの連鎖とmatchの使い分けがわかる
なぜ match-case か
# if/elif が積み重なると読みにくい
if status == "ok":
handle_ok()
elif status == "ng":
handle_ng()
elif status == "pending":
handle_pending()
else:
handle_unknown()→ match なら「何で分岐しているか」が視覚的に明確になる
最小例
# main.py
status = "ok"
match status:
case "ok":
print("成功")
case "ng":
print("失敗")
case _:
print("不明")uv run python main.py # → 成功
ワイルドカード _
match code:
case 200:
print("OK")
case 404:
print("Not Found")
case 500:
print("Server Error")
case _:
print("その他") # ← どれにも該当しないとき_ は「何でもマッチして変数に束縛しない」特別なパターン。
複数値を 1 case にまとめる (|)
match method:
case "GET" | "HEAD":
print("読み取り系")
case "POST" | "PUT" | "PATCH":
print("書き込み系")
case "DELETE":
print("削除")
case _:
print("未対応")変数束縛
match point:
case (0, 0):
print("原点")
case (x, 0):
print(f"x軸上: x={x}") # x に値が束縛される
case (0, y):
print(f"y軸上: y={y}")
case (x, y):
print(f"任意の点: ({x}, {y})")タプルの構造ごと分解して、変数に束縛できる。
if との使い分け
| こんな時 | 使う構文 |
|---|---|
| 値を「等しいか」で分ける | match |
| 数値の「範囲」で分ける (>=, < 等) | if/elif |
| 構造 (tuple / dict) を分解して使う | match |
| 1 つの条件で True/False | if |
→ match は「等値判定 + パターン分解」、if は「真偽値の評価」
drill
drill/ — HTTP ステータスコードを分類する関数を完成させる
拡張課題
- ガード節 (
if付き case): case にさらに条件を追加できる
match age:
case n if n < 0:
print("不正な値")
case n if n < 20:
print("未成年")
case _:
print("成人")
- dict のパターンマッチ: API レスポンスを分解する
match response:
case {"status": "ok", "data": data}:
print(f"成功: {data}")
case {"status": "error", "message": msg}:
print(f"エラー: {msg}")
- クラスのパターンマッチ: dataclass などの属性で分岐 (FastAPI のレスポンス処理で使う)
よくある詰まり
| 症状 | 原因 | 対処 |
|---|---|---|
SyntaxError: invalid syntax で match が読めない | Python 3.9 以下 | Python 3.10+ を使う (uv run --python 3.12 ...) |
全部 case _: に落ちる | 大文字小文字や型の違い | "GET" と "get" は別物 / 200 と "200" は別物 |
| 変数を比較したつもりが束縛される | case some_var: は新しい変数定義になる | 定数比較は case Status.OK: のように属性アクセス形式 or リテラルを使う |
次に学ぶ領域
| 領域 | 続けて読む |
|---|---|
| dataclass + match | class/ |
| FastAPI でのリクエスト分岐 | fastapi-basic/ |
| 例外で分岐するパターン | exception/ |
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。