採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

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/Falseif

match は「等値判定 + パターン分解」、if は「真偽値の評価」

drill

drill/ — HTTP ステータスコードを分類する関数を完成させる

拡張課題

  1. ガード節 (if 付き case): case にさらに条件を追加できる
   match age:
       case n if n < 0:
           print("不正な値")
       case n if n < 20:
           print("未成年")
       case _:
           print("成人")
   
  1. dict のパターンマッチ: API レスポンスを分解する
   match response:
       case {"status": "ok", "data": data}:
           print(f"成功: {data}")
       case {"status": "error", "message": msg}:
           print(f"エラー: {msg}")
   
  1. クラスのパターンマッチ: dataclass などの属性で分岐 (FastAPI のレスポンス処理で使う)

よくある詰まり

症状原因対処
SyntaxError: invalid syntaxmatch が読めないPython 3.9 以下Python 3.10+ を使う (uv run --python 3.12 ...)
全部 case _: に落ちる大文字小文字や型の違い"GET""get" は別物 / 200"200" は別物
変数を比較したつもりが束縛されるcase some_var: は新しい変数定義になる定数比較は case Status.OK: のように属性アクセス形式 or リテラルを使う

次に学ぶ領域

領域続けて読む
dataclass + matchclass/
FastAPI でのリクエスト分岐fastapi-basic/
例外で分岐するパターンexception/
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。