メインコンテンツへスキップ

pydanticが流行った本当の理由

🧭 はじめに(What / Why)

このページで理解できることは次の3点です。

  • pydanticは「型チェックがしたいライブラリ」ではなく、境界での契約を実装するための道具であること
  • pydanticが爆発的に流行った理由は、速度でも機能量でもなく置き場所が明確だったこと
  • pydanticを使う/使わないの判断軸は「内部表現か」「外部との境界か」で切るべきこと

pydanticはPythonに「実行時の型」を持ち込んだのではなく、「型を契約として扱う場所」を与えた。


🧱 立ち位置の整理(Before / After)

✅ 何と置き換わる存在か

  • Before

    • 手書きのdictアクセス
    • if文だらけのバリデーション
    • JSON → Python変換の場当たり対応
  • After

    • 型注釈ベースでの宣言
    • 自動パース・検証・エラーメッセージ生成
    • JSON境界を明示したデータモデル

😩 それがなぜ辛かったか

  • 外部入力(HTTP/JSON/ENV)は常に汚れている

  • dictベースだと

    • 欠損・型違い・余分なキーが静かに混入する
    • エラーが「どこで壊れたか」分からない
  • バリデーションロジックが分散し、修正が怖い

🎯 解決したかった本質

  • 「ここから先は正しい」という境界を明示したい
  • 「入力の揺れ」を受け止め、内部をきれいに保つ防波堤が欲しかった

🧠 設計思想の核(最重要)

優先したもの

  • 型 = 契約(Contract) という思想 → 型注釈を「ヒント」ではなく「仕様」に昇格させる

  • JSONとの親和性

    • dict / list / str / int / float / null
    • Web APIの現実に直結している
  • 失敗時のUX

    • どのフィールドが
    • 何故ダメで
    • 何が来たのか を機械的に説明できる

pydanticの本質的価値はエラーメッセージ生成器としての完成度の高さ。

捨てたもの

  • Python的な「何でも許す柔軟さ」
  • 軽量さ(dataclassより明確に重い)
  • 魔法を完全に隠すこと(内部はかなり複雑)

✅❌ できること / できないこと

✅ できること(得意)

  • 外部入力(JSON / Query / Header / ENV)の

    • パース
    • 型変換
    • バリデーション
  • エラーの構造化された表現

  • 型情報の再利用(FastAPI / CLI / 設定)

❌ できないこと(期待してはいけない)

  • 高頻度・大量生成される内部オブジェクトの表現
  • 純粋な値オブジェクトとしての軽量運用
  • 「全部pydanticで統一」した美しい設計

pydanticモデルをドメイン内部の基本データ構造に使い始めると、性能・可読性・設計自由度の全てが削られる。


🧪 典型的な利用パターン(最小)

境界モデルとしての最小例

from pydantic import BaseModel

class UserInput(BaseModel):
    id: int
    name: str
    age: int
  • この時点で

    • 欠損
    • 型違い
    • 不正値 が明示的なエラーになる
  • ここを通過した後は、dataclass等に変換して内部処理へ渡す

境界 → pydantic → 内部表現(dataclass)という一方向の流れを作ると、設計が驚くほど安定する。


🧯 よくある誤解・アンチパターン

1) 「型安全Pythonが実現した」

  • pydanticはPython全体を型安全にしない
  • 境界の一点だけを堅くする道具

2) pydanticモデルをロジック層で回す

  • メソッド追加
  • 状態変更
  • ビジネスルール埋め込み → モデルが肥大化し、責務が崩れる

pydanticモデルに振る舞いを足し始めたら、境界モデルとしての役割を見失っている。

3) dataclassの完全上位互換だと思う

  • 目的が違う
  • 置き場所が違う
  • 併用前提で設計すべき

🔗 他ライブラリとの関係

  • dataclass: 内部表現・値オブジェクト向け。pydanticの「後段」に置く。
  • FastAPI: pydanticを前提に設計されたため、契約 → ドキュメント → 実装が一直線になる。
  • orjson: pydantic v2では高速JSON処理と組み合わさり、境界処理のコストが下がった。

pydanticは単体で完結するOSSではなく、境界に置かれる前提で真価を発揮する部品


🧾 まとめ(1文で言うと)

pydanticは「型チェックのためのライブラリ」ではなく、外部と内部を分断し、契約を強制するための境界専用ツールである。