Python Pydantic
· 約4分
Pydantic は、Pythonのクラス構文と型ヒント(Type Hint)を活用して、以下のような堅牢なデータ処理を可能にするライブラリです。
-
データの検証(Validation): 型ヒントに基づき、値の型や制約条件を自動チェック
-
型の自動変換(Coercion): 可能であれば、入力値を期待される型に自動変換
-
データのシリアライズ/デシリアライズ: 辞書やJSONからのモデル生成、辞書やJSON形式での出力
-
バリデーションロジックのカスタマイズ: フィールド単位・モデル単位で検証ロジックを定義可能
1. モデルの定義
基本は BaseModel を継承したクラスを作るだけです。必要に応じて Field() を使うことで、制約(例: 最大文字数、正の数など)や説明文を追加できます。
from typing import Optional
from pydantic import BaseModel, Field, EmailStr
class User(BaseModel):
name: str
age: int
email: str
# Valid data
user = User(name="Alice", age=30, email="[email protected]")
print(user)
# 不正なデータは自動的にエラーになります:
try:
User(name="Bob", age="twenty", email="bob@invalid")
except Exception as e:
print(e)
2. フィールド制約と説明文の付与
class Product(BaseModel):
id: int = Field(..., gt=0, description="Unique product identifier")
name: str = Field(..., min_length=2, max_length=100)
price: float = Field(..., gt=0.0)
description: Optional[str] = None # Optional field
seller_email: EmailStr # Pydantic's built-in email validation
product = Product(id=1, name="Laptop", price=1200.50, seller_email="[email protected]")
print(product)
3. モデルの生成方法
- 辞書からの検証付きインスタンス生成
- JSON文字列からの生成
辞書からの作成は、Constructorまたはmodel_validateを使って、モデルを作成できます。
model_validate_json はJsonの文字列でモデルを作成できます。
user_data = {
"name": "Alice",
"age": 30,
"email": "[email protected]"
}
user_model = User(**user_data)
user_model = User.model_validate(user_data)
class Movie(BaseModel):
title: str
year: int
director: str
genres: list[str]
# Your JSON string data
json_string = '''
{
"title": "Inception",
"year": 2010,
"director": "Christopher Nolan",
"genres": ["Sci-Fi", "Action", "Thriller"]
}
'''
movie_model = Movie.model_validate_json(json_string)
4. モデルのシリアライズ: model_validate(), model_validate_json()
- model_dump: Python辞書へ変換
- model_dump_json: JSON文字列で出力
from pydantic import BaseModel
class City(BaseModel):
name: str
population: int
tokyo = City(name="Tokyo", population=14000000)
print(tokyo.model_dump())
print(tokyo.model_dump_json(indent=2)) # Pretty print JSON
5. カスタムバリデーション
- @field_validator 関数を使って、フィールド単位のバリデータ
- @model_validator 関数を使って、モデル全体の検証
from datetime import date
from pydantic import BaseModel, ValidationError, field_validator, model_validator
class Event(BaseModel):
name: str
start_date: date
end_date: date
@field_validator('name')
@classmethod
def check_name_is_not_empty(cls, v):
if not v.strip():
raise ValueError('Event name cannot be empty')
return v
@model_validator(mode='after') # 'after' means after field validation
def check_dates_order(self):
if self.start_date > self.end_date:
raise ValueError('Start date must be before end date')
return self
try:
event1 = Event(name="Conference", start_date="2025-07-20", end_date="2025-07-22")
print(event1)
except ValidationError as e:
print(e)
try:
Event(name="Bad Event", start_date="2025-07-25", end_date="2025-07-23")
except ValidationError as e:
print(e)
6. 入れ子モデル(ネスト構造)
from pydantic import BaseModel
from typing import List
class Address(BaseModel):
street: str
city: str
zip_code: str
class Customer(BaseModel):
customer_id: int
name: str
shipping_addresses: List[Address]
customer_data = {
"customer_id": 123,
"name": "Jane Doe",
"shipping_addresses": [
{"street": "123 Main St", "city": "Anytown", "zip_code": "12345"},
{"street": "456 Oak Ave", "city": "Otherville", "zip_code": "67890"}
]
}
customer = Customer.model_validate(customer_data)
print(customer)
7. JSON Schemaの自動生成
from pydantic import BaseModel
class Task(BaseModel):
id: int
title: str
completed: bool = False
print(Task.model_json_schema(indent=2))
おわりに
Pydanticは以下のような用途に特に有効です:
-
APIのリクエスト・レスポンスモデル(FastAPIとの統合が特に強力)
-
設定ファイルや外部入力の安全な読み込み
-
型安全で自己文書化されたデータモデルの構築
-
静的型チェックが弱いPythonにおいて、Pydanticは強力な型バリデーションと開発者体験を提供してくれます。
参考リンク
document on how to use it.