pydanticの BaseModel
とは?
Pythonでデータを扱うとき、特にWebアプリケーションやAPI開発の現場では、入力データの型や形式が正しいかを簡単にチェックしたい場面が多くあります。そこでよく使われるのがpydanticというライブラリであり、その中心となるクラスが BaseModel
です。
BaseModel
とは何か?
BaseModel
は、pydanticが提供するデータモデルの基本クラスであり、主に以下の役割を持っています。
- データバリデーション(データ検証)
- 型チェック(型の整合性を確認)
- データ変換(型に応じた適切な変換)
- JSON形式でのシリアライズ/デシリアライズ
つまり、BaseModel
を継承するだけで、定義したデータ型に対して自動的に型の検証やデータ変換を行ってくれる非常に便利なクラスです。
基本的な使い方
例えば、ユーザーの情報を扱うデータモデルを定義したい場合、次のように書けます。
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
email: str
このように書くことで、次のようなことが簡単にできます。
データ検証と型チェック
以下のようにモデルを使ってデータを渡すと、自動的に型チェックを行います。
# 正しいデータの場合
user = User(id=1, name="Keita", email="keita@example.com")
print(user)
もし、型が異なるデータを渡してしまった場合はエラーになります。
# 誤った型を渡した場合
user = User(id="one", name="Keita", email="keita@example.com")
# => エラーが発生: idは整数型(int)でなければいけない
JSONとの相互変換
データを簡単にJSON形式に変換したり、逆にJSONデータをモデルに変換できます。
# JSONへの変換
user_json = user.json()
print(user_json)
# JSONからモデルへの変換
user_from_json = User.parse_raw(user_json)
print(user_from_json)
どんな場面で使われる?
主に以下のような場面でよく使われます。
- Web APIのデータ検証と定義(FastAPIなどでよく使われる)
- 設定ファイルの管理
- データベースから取得したデータの検証や加工
これらの用途で、シンプルかつ安全にデータを扱う仕組みを作るのに役立っています。
BaseModel
と混同しやすい他の概念
BaseModel
は非常に便利な仕組みですが、Pythonには似たような目的で使える構文やライブラリがいくつかあります。以下は、混同しやすい代表的な例です。
@dataclass
(標準ライブラリ)
- 軽量なデータ構造を定義するための標準機能。
- 型アノテーションはあるが、バリデーションや自動変換は行わない。
NamedTuple
- タプルに名前をつけたような構造。変更不可(イミュータブル)。
- 型情報はあるが、実行時のチェックはない。
TypedDict
- 辞書に型情報を与えるための構造。
- 静的型チェック用で、実行時にはチェックされない。
attrs
ライブラリ
-
@attr.s
や@define
を使って柔軟にデータ構造を作れる。 - バリデーション機能あり。ただしJSON変換や型変換は自前で対応することが多い。
比較まとめ
概念 | バリデーション | 自動型変換 | JSON変換 | 実行時型チェック | 備考 |
---|---|---|---|---|---|
BaseModel |
✅ | ✅ | ✅ | ✅ | APIやフォーム処理向け |
@dataclass |
❌(自作必要) | ❌ | ❌(手動) | ❌ | 軽量な構造体向け |
NamedTuple |
❌ | ❌ | ❌ | ❌ | イミュータブル |
TypedDict |
❌ | ❌ | ❌ | ❌(静的型のみ) | 型ヒント用 |
attrs |
✅(定義可) | ❌ | ❌ | ❌(オプション) | 柔軟なデータクラス |
まとめ
BaseModel
は、pydanticライブラリでデータを扱うための基本的なクラスであり、データの検証や型チェックを容易にします。Pythonで安全かつ簡単にデータ管理したい場合にぜひ活用してみましょう。
また、似たような機能を持つ構文やライブラリ(@dataclass, NamedTuple, TypedDict, attrsなど)との違いを理解して、適材適所で使い分けることが重要です。