Pythonのデータ型を賢く扱う!「pydantic」で堅牢なアプリケーションを開発しよう

投稿者: | 2026-06-27

皆さん、こんにちは!
今回は、Pythonでのデータ処理を強力にサポートしてくれるライブラリ「pydantic」をご紹介します。WebAPIの入出力や、設定ファイルの管理など、プログラムで扱うデータの型や構造をしっかり定義し、自動的に検証してくれる優れものなんですよ。

概要

pydanticは、Pythonの型ヒント(Type Hinting)を最大限に活用し、データの検証(バリデーション)、シリアライズ(PythonオブジェクトからJSONなどへの変換)、デシリアライズ(JSONなどからPythonオブジェクトへの変換)を簡単かつ効率的に行うためのライブラリです。特に素晴らしいのは、実行時(runtime)に型チェックを行ってくれる点です。

静的な型チェックツール(Mypyなど)と違って、pydanticはプログラムが実際に動いている時にデータの整合性を確認してくれるんです!とても心強いですよね。

メリット

  • コードの堅牢性向上: 意図しないデータ型や値の混入を未然に防ぎ、実行時のエラーを大幅に削減します。
  • 開発効率アップ: データ構造が明確になり、チーム開発における認識の齟齬を防ぎます。また、自動的なバリデーションにより、手動でのチェックコード記述の手間を省けます。
  • 自動ドキュメント生成: 定義したデータモデルからJSON Schemaなどを自動生成できるため、APIドキュメント作成などにも役立ちます。
  • 優れた連携性: FastAPIのようなモダンなWebフレームワークでは、pydanticがデータの処理基盤として深く統合されており、非常にスムーズな開発が可能です。

サンプルコード

それでは、実際にpydanticを使った簡単なデータモデルの定義と、データの検証の様子を見てみましょう。

まずはpydanticをインストールします。

pip install pydantic

main.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_jsonmodel_validateといったメソッドは、pydantic v2で新しく追加されたものなので、もし古いバージョンをお使いの場合は注意してくださいね!

みーちゃんのワンポイント

pydanticの最大の魅力は、Pythonの型ヒントを活かして実行時(runtime)にデータのバリデーションを行ってくれることです。これにより、プログラムの途中で予期せぬデータ形式によるエラーを防ぎ、より堅牢なアプリケーション開発に貢献します。外部からの入力データや設定値など、信頼性の低いデータを扱う際に積極的に活用してみてくださいね。