typing.assert_never 3.12 PEP 695 の型パラメータ構⽂ エラーの型を union で並べて、match で分岐できるようになった match の漏れを mypy や pyright が⾒つけてくれる class Result[T, E]: と書ける。ジェネリクスがだいぶ読みやすくなった ずっと例外の⽂化 (EAFP) の⾔語だったけれど、いまは直和を型で書いて、漏れを CI で⾒つ けられる
create_order(cart) if result.is_err: match result.err: case OutOfStock(): ... case PaymentDeclined(): ... case _: assert_never(result.err) 1 種類増やしたら、何が 起きる?
... エラーを 1 種類増やすと result = create_order(cart) if result.is_err: match result.err: err_value を match している場所すべてで CI が落ちる case OutOfStock(): ... case PaymentDeclined(): ... case _: assert_never(result.err) $ mypy . error: Argument 1 to "assert_never" has incompatible type "CouponExpired"; expected "Never" try/except ではこうならな い。増えた失敗を except は 気づかずに飲み込み続ける