前回までの連載では、FastAPIの基本的な使い方を解説してきました。その中で何度も登場した「データの型定義」を支えているのが、Pydantic(パイダンティック)というライブラリです。
前回の記事はこちら:
今回は「FastAPIを使っているけれど、実はPydanticの仕組みをよく知らない」という方に向けて、その強力な機能とメリットを深掘りします。
Pydanticとは何か?
Pydanticは、Pythonの型ヒントを利用して「データのバリデーション(妥当性確認)」と「設定管理」を行うライブラリです。
Pythonは本来、動的型付け言語であり、変数に何を代入しても実行するまでエラーになりにくい性質があります。しかし、Web APIのように外部からどんなデータが飛んでくるか分からない世界では、この性質がバグの温床になります。
Pydanticを使うことで、「送られてきたデータが、期待した型やルール通りか」を瞬時に判定し、安全なデータだけをプログラム内部に受け入れることができます。
「バリデーション」ではなく「パース(解析)」
Pydanticのドキュメントには、「Pydanticはバリデーションライブラリではなく、パース(Parsing)ライブラリである」と書かれています。これが非常に面白いポイントです。
単に「型が違うからダメ!」と拒否するだけでなく、可能な限り正しい型に変換(キャスト)しようとしてくれます。
具体的な変換例
from pydantic import BaseModel
class User(BaseModel):
id: int
is_active: bool
# 文字列の "123" や "true" を渡してみる
user = User(id="123", is_active="true")
print(user.id) # 123 (int型に変換されている!)
print(user.is_active) # True (bool型に変換されている!)組み込み開発で、シリアル通信などで受け取った文字列を atoi() や atof() で変換する手間を、Pydanticがすべて自動でやってくれているイメージです。
Fieldを使ったさらに高度な制約
単に「int型であること」だけでなく、「値が0以上100以下であること」や「文字列の長さは5文字以上」といった細かい制約も、Pydanticなら宣言的に記述できます。
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=2, max_length=50) # 2文字以上50文字以内
price: float = Field(..., gt=0) # 0より大きい(Greater Than 0)
tax: float = Field(default=0.1, le=0.5) # デフォルト0.1、0.5以下(Less than or Equal)このように Field を使うことで、ビジネスロジックを汚すことなく、データの入り口で厳密なルールを敷くことが可能です。
組み込みエンジニアが感動する「構造体」としての使い勝手
C言語でいう struct と、Pydanticの BaseModel の違いを比較してみましょう。
| 特徴 | C言語の構造体 (struct) | Pydantic (BaseModel) |
| データ保持 | できる | できる |
| 型チェック | コンパイル時に厳密 | 実行時に厳密(自動パース) |
| 境界値チェック | 手動でif文を書く | Field で宣言するだけ |
| JSON変換 | 手動(ライブラリ使用) | 標準で model_dump_json() がある |
Pydanticは、いわば「自分で自分の正しさを証明し、入出力も自在にこなす高機能な構造体」です。
まとめ:なぜFastAPIと相性がいいのか
FastAPIがこれほどまでに使いやすい理由は、Pydanticをベースにしているからです。
- 型ヒントを書く:開発者のため(エディタの補完が効く)
- Pydanticが動く:プログラムのため(データが保証される)
- Swagger UIが出る:利用者のため(仕様書が自動でできる)
この3つのメリットが、1つのクラス定義から生まれるエコシステムこそがFastAPIの強みです。
Pydanticをマスターすれば、FastAPIだけでなく、設定ファイルの読み込みやデータのスクレイピングなど、あらゆるPythonプログラミングが劇的に堅牢になります。ぜひ、連載第4回に進む前に、自分なりの「最強のモデル」を作って遊んでみてください!


コメント