
皆さん、こんにちは!
今回は、Pythonでのデータ処理を強力にサポートしてくれるライブラリ「pydantic」をご紹介します。WebAPIの入出力や、設定ファイルの管理など、プログラムで扱うデータの型や構造をしっかり定義し、自動的に検証してくれる優れものなんですよ。
概要
pydanticは、Pythonの型ヒント(Type Hinting)を最大限に活用し、データの検証(バリデーション)、シリアライズ(PythonオブジェクトからJSONなどへの変換)、デシリアライズ(JSONなどからPythonオブジェクトへの変換)を簡単かつ効率的に行うためのライブラリです。特に素晴らしいのは、実行時(runtime)に型チェックを行ってくれる点です。
静的な型チェックツール(Mypyなど)と違って、pydanticはプログラムが実際に動いている時にデータの整合性を確認してくれるんです!とても心強いですよね。
メリット
- コードの堅牢性向上: 意図しないデータ型や値の混入を未然に防ぎ、実行時のエラーを大幅に削減します。
- 開発効率アップ: データ構造が明確になり、チーム開発における認識の齟齬を防ぎます。また、自動的なバリデーションにより、手動でのチェックコード記述の手間を省けます。
- 自動ドキュメント生成: 定義したデータモデルからJSON Schemaなどを自動生成できるため、APIドキュメント作成などにも役立ちます。
- 優れた連携性: FastAPIのようなモダンなWebフレームワークでは、pydanticがデータの処理基盤として深く統合されており、非常にスムーズな開発が可能です。
サンプルコード
それでは、実際にpydanticを使った簡単なデータモデルの定義と、データの検証の様子を見てみましょう。
まずはpydanticをインストールします。
pip install pydanticmain.py
from pydantic import BaseModel, ValidationError
from typing import List, Optional
# データモデルの定義
class User(BaseModel):
id: int
name: str = "名無しさん" # デフォルト値
email: Optional[str] = None # オプションフィールド
age: int
is_active: bool = True
tags: List[str] = []
# 有効なデータの例
try:
user1 = User(id=1, name="Alice", age=30, email="alice@example.com")
print(f"ユーザー1: {user1.model_dump_json(indent=2)}")
user2 = User(id=2, age=25) # name, is_active, tagsはデフォルト値が適用される
print(f"ユーザー2: {user2.model_dump_json(indent=2)}")
except ValidationError as e:
print(e.json())
# 無効なデータの例
print("\n--- 無効なデータ ---")
try:
# idが文字列、ageが負の値
invalid_user = User(id="abc", name="Bob", age=-5)
except ValidationError as e:
print(f"検証エラーが発生しました:\n{e.json(indent=2)}")
# さらに、外部から受け取ったデータをパースする例
json_data = '''
{
"id": 3,
"name": "Charlie",
"email": "charlie@example.com",
"age": "28",
"is_active": false
}
'''
import json
try:
data_dict = json.loads(json_data)
user3 = User.model_validate(data_dict) # pydantic v2ではparse_objからmodel_validateに変更
print(f"ユーザー3 (JSONから): {user3.model_dump_json(indent=2)}")
except ValidationError as e:
print(f"JSONデータからの検証エラー:\n{e.json(indent=2)}")実行結果
ユーザー1: {
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"age": 30,
"is_active": true,
"tags": []
}
ユーザー2: {
"id": 2,
"name": "名無しさん",
"email": null,
"age": 25,
"is_active": true,
"tags": []
}
--- 無効なデータ ---
検証エラーが発生しました:
[
{
"type": "int_parsing",
"loc": [
"id"
],
"msg": "Input should be a valid integer, unable to parse string as an integer",
"input": "abc",
"url": "https://errors.pydantic.dev/2.13/v/int_parsing"
}
]
ユーザー3 (JSONから): {
"id": 3,
"name": "Charlie",
"email": "charlie@example.com",
"age": 28,
"is_active": false,
"tags": []
}このように、定義したUserモデルに沿って、渡されたデータが自動的に検証されます。間違った型のデータを渡すと、ValidationErrorが適切に発生し、どこに問題があるかを教えてくれますね。
model_dump_jsonやmodel_validateといったメソッドは、pydantic v2で新しく追加されたものなので、もし古いバージョンをお使いの場合は注意してくださいね!
みーちゃんのワンポイント
pydanticの最大の魅力は、Pythonの型ヒントを活かして実行時(runtime)にデータのバリデーションを行ってくれることです。これにより、プログラムの途中で予期せぬデータ形式によるエラーを防ぎ、より堅牢なアプリケーション開発に貢献します。外部からの入力データや設定値など、信頼性の低いデータを扱う際に積極的に活用してみてくださいね。

