スポンサーリンク

Pydanticとは?Pythonで安全なデータバリデーションを簡単に実装する方法【初心者向け】

Python入門
  1. 1. はじめに|PydanticでPythonコードの安全性を高めよう
  2. 2. Pydanticとは?|データクラスより強力な型チェックツール
    1. ◆ そもそも、なぜデータのチェックが必要なの?
    2. ◆ そこで登場、Pydantic!
    3. ◆ データクラスとの違いまとめ
  3. 3. 基本の使い方|型ヒントによる自動バリデーション
    1. ◆ まずはインストールしよう
    2. ◆ Pydanticクラスの基本形
    3. ◆ オブジェクトを作ってみよう!
    4. ◆ 自動で型を直してくれることもある!
    5. ◆ 補足:キーワード引数で渡す
    6. 🌟まとめ:ここまでのおさらい
  4. 4. より厳密なチェックを行う|strictモードと型制限
    1. ◆ strictモードってなに?
    2. ◆ 使い方はすごく簡単!
    3. ◆ どんなときにstrictを使うの?
    4. ◆ さらに!「再代入」もチェックしたい場合は?
    5. 🌟まとめ:strictモードでデータの安全性を強化しよう
  5. 5. 実行時エラーを扱う|構造化されたエラーハンドリング
    1. ◆ エラーをキャッチする方法
    2. ◆ .errors() を使って、エラーを見やすくしよう!
    3. ◆ pprintでさらに見やすく!
    4. 🌟まとめ:エラーは「読める形」で受け取ろう
  6. 6. バリデーションルールを追加しよう|数値・文字列・日付
    1. ◆ 使い方は Field() に条件をつけるだけ!
    2. ◆ 数値に使えるバリデーション
    3. ◆ 文字列に使えるバリデーション:正規表現
    4. ◆ 日付に使えるバリデーション
    5. ◆ デフォルト値も Field() でOK!
    6. 🌟まとめ:Pydanticなら「ルール作り」もラクラク!
  7. 7. 値の変更を禁止する|frozenモードで読み取り専用に
    1. ◆ 特定の値だけ変更できないようにする(フィールド単位)
    2. ◆ クラス全体を「完全に変更不可」にする
    3. ◆ どんなときに使うの?
    4. 🌟まとめ:値を変えさせない=バグ防止の第一歩!
  8. 8. 独自ルールの追加|オリジナルバリデーションの書き方
    1. ◆ 使い方は @field_validator() を使うだけ!
    2. 💡ポイント:
    3. ◆ 実行してみよう!
    4. ◆ 複数の変数をまとめてチェックしたいときは?
    5. ◆ どんなときに使うの?
    6. 🌟まとめ:自由にルールを作れるから、実用度MAX!
  9. 9. データの入出力|辞書・JSONとのシームレスな連携
    1. ◆ オブジェクトから辞書に変換する
    2. ◆ オブジェクトからJSON文字列に変換する
    3. ◆ 辞書やJSONからPydanticオブジェクトを作る
    4. 🌟まとめ:データの変換もPydanticにおまかせ!
  10. 10. まとめ|Pydanticを使って安全で信頼性の高いコードに
    1. 💡Pydanticってどんなものだった?
    2. 🛠 こんなときにPydanticを使うと◎
    3. ✅ あわせて読みたい|関連記事リンク集
  11. よくある質問(Q&A)
    1. 関連投稿:

1. はじめに|PydanticでPythonコードの安全性を高めよう

こんにちは!Pythonでコードを書いていて、こんな経験はありませんか?

「データの中に変な値が混じってバグになった!」
「この変数、文字列のつもりだったのに数字が入ってる…?」

プログラムって、正しいデータが入ってくる前提で動くことが多いですよね。でも、現実はそんなに甘くありません。ユーザーの入力ミスや、APIからの変なデータ、ファイルの読み込みミスなど、思わぬタイミングでおかしなデータが入り込んできます。


そんなときに役立つのが、今回紹介する「Pydantic(パイダンティック)」というライブラリです!

Pydanticを使うと、Pythonのクラスに**「この変数にはどんな型のデータが入るべきか」をはっきり指定できて、しかも、実際にデータが入ったときに自動でチェック(=バリデーション)してくれるんです。まさに、「型ヒントのパワーアップ版」**って感じですね。

また、単に「文字列かどうか」「数値かどうか」だけでなく、

  • 数字の範囲(例:0〜1000の間だけOK)
  • 正規表現での文字列チェック
  • 日付が未来か過去か
  • 値を後から書き換えできないようにする設定

など、安全なプログラム作りに役立つ機能がたくさんそろっています。

この記事では、Pydanticの基本の使い方から、ちょっと便利な設定方法、さらには独自のルールまで、初心者でも安心して使えるようにわかりやすく解説していきます。




2. Pydanticとは?|データクラスより強力な型チェックツール

「Pydantic(パイダンティック)」って聞き慣れない言葉かもしれませんが、実はとっても便利なライブラリなんです。

一言で言うと、**「クラスに入ってくるデータをちゃんとチェックしてくれるツール」**です。

◆ そもそも、なぜデータのチェックが必要なの?

たとえば、Pythonでこんなクラスを作ったとします:

from dataclasses import dataclass

@dataclass
class User:
name: str
age: int

このクラスは、「ユーザーの名前は文字列」「年齢は整数」というルールを決めてます。でも実際には…

user = User(name=123, age="こんにちは")

↑こんな変なデータでもエラーにならずに作れてしまうんです😱
つまり、書いたルールが守られていないのに、Pythonは気にしないんですね…。

◆ そこで登場、Pydantic!

Pydanticを使うと、同じようなクラスを**「ちゃんとルールを守らせる形」で作れる**ようになります。

まずはインストールから👇

pip install pydantic

そして、こんなふうに使います:

from pydantic import BaseModel

class User(BaseModel):
name: str
age: int

今度はどうなるかというと…

user = User(name=123, age="こんにちは")

↑これは即エラー!
「nameは文字列って書いてあるのに数字が来てるよ!」って教えてくれるんです👏

さらにすごいのが、文字列の "123" を整数として受け取ってくれるような、かしこい自動変換機能もついています(必要に応じてオフにもできます)。


◆ データクラスとの違いまとめ

比較項目データクラスPydantic(BaseModel)
型ヒントの強制力なしあり(チェックされる)
自動バリデーションなしあり
自動型変換なしあり(※設定でオフ可)
エラーの構造化なしあり
JSONとの変換手動.model_dump() などで簡単

「ただのデータ入れ物」だったクラスが、Pydanticを使うことでしっかりとした安全な設計になります。特にAPIや外部からの入力を扱うときには、必須レベルで役に立つツールですよ!




3. 基本の使い方|型ヒントによる自動バリデーション

ここからは、Pydanticの「基本のキ」ともいえる使い方を紹介します!

「型ヒントだけで自動的にバリデーションしてくれるってどういうこと?」と思ったあなた、ここでしっかり体験してみましょう💡


◆ まずはインストールしよう

まだインストールしていない方は、ターミナルで次のコマンドを打ってください:

pip install pydantic

◆ Pydanticクラスの基本形

Pydanticでは、BaseModelという特別なクラスを使います。このクラスを継承するだけで、バリデーション機能がバッチリ使えるようになります!

from pydantic import BaseModel

class User(BaseModel):
name: str
age: int

このクラスは、「名前は文字列」「年齢は整数」というルールを持ったデータ構造です。


◆ オブジェクトを作ってみよう!

user = User(name="田中太郎", age=25)
print(user)

✅ 結果:

name='田中太郎' age=25

ちゃんとルールどおりのデータなら問題なし!

でも、もし型が違っていたら…?

user = User(name=12345, age="hello")

❌ 結果:

pydantic_core._pydantic_core.ValidationError: ...

エラーになってくれます!これは「nameは文字列じゃないし、ageも整数じゃないよ!」って教えてくれてるんです。


◆ 自動で型を直してくれることもある!

Pydanticは「これは変換できそうだな」と判断した場合、型変換してくれることがあります。たとえば:

user = User(name="佐藤花子", age="30")
print(user.age) # → 30(int型になってる!)

このように、文字列の “30” も自動的に整数に変換してくれるんです。

便利だけど、「勝手に変換してほしくない!」ってときもありますよね。それは次の章「strictモード」で解説します😊


◆ 補足:キーワード引数で渡す

Pydanticでは、オブジェクトを作るときに「キーワード引数(名前付きの引数)」で渡す必要があります。

User("佐藤", 22)  # ❌ これはエラー
User(name="佐藤", age=22) # ⭕

間違いやすいポイントなので注意しましょう!


🌟まとめ:ここまでのおさらい

  • BaseModelを継承してクラスを定義するだけでバリデーションOK!
  • 型ヒントに合わないデータはエラーになる
  • 変換できそうなデータは、自動で変換してくれることもある



4. より厳密なチェックを行う|strictモードと型制限

前のセクションでは、Pydanticが自動で型変換してくれることを紹介しましたね。

たとえば、こんなふうに:

from pydantic import BaseModel

class User(BaseModel):
age: int

user = User(age="30") # 自動で文字列 → 整数に変換される
print(user.age) # → 30

これはとっても便利なんですが、時には…

「いやいや、型はキッチリ守ってほしいんだよ!!」

っていうシーンもありますよね。たとえば、APIで受け取る重要なデータとか、セキュリティが大事なときとか。

そんなときに活躍するのが「strict(ストリクト)モード」です!


◆ strictモードってなに?

strictとは「厳密な・きびしい」って意味で、自動変換なしで、指定した型と完全に一致しないとエラーになるようにできます。


◆ 使い方はすごく簡単!

PydanticのField()関数に strict=True を追加するだけです。

from pydantic import BaseModel, Field

class User(BaseModel):
age: int = Field(strict=True)

この設定をすると、たとえ "30" のような文字列でも 整数として受け付けてくれません

user = User(age="30")  # ❌ これはエラー

◆ どんなときにstrictを使うの?

  • 入力値が想定通りの型であることを強く保証したいとき
  • 自動変換が逆にバグの原因になるかもしれないとき
  • ユーザーや外部システムからの入力を完全にチェックしたいとき

こんなときに strict=True はとても役立ちます。


◆ さらに!「再代入」もチェックしたい場合は?

Pydanticは、最初にデータを受け取ったときだけバリデーションを行います。
つまり、後から値を変更しても、ふつうはチェックしてくれません。

user = User(age=30)
user.age = "なんと" # ❌ 本来はダメだけど、通ってしまう…

こんなふうに、後からの変更も厳しくチェックしたい場合は、クラス定義に次の設定を追加しましょう:

class User(BaseModel, validate_assignment=True):
age: int = Field(strict=True)

これで、後からの代入もバリデーション対象になります!


🌟まとめ:strictモードでデータの安全性を強化しよう

  • Field(strict=True) を使うと、型が厳密にチェックされる
  • 自動変換を防いで、バグを未然に防ぐことができる
  • validate_assignment=True再代入時のチェックも可能!



5. 実行時エラーを扱う|構造化されたエラーハンドリング

さて、ここまでで「Pydanticは型が合わなければエラーになる!」というのは体験済みですね。

でもそのエラー、どう扱ったらいいのかって困ることありませんか?
「エラー文が長すぎて何が原因かわからない…」ってなったこと、きっとあるはずです😅

Pydanticでは、エラーの内容を“ちゃんと整理された形”で取り出す方法が用意されているんです!
それが「構造化されたエラーハンドリング」。


◆ エラーをキャッチする方法

まずは、try...exceptでエラーをキャッチします。

from pydantic import BaseModel, ValidationError

class User(BaseModel):
name: str
age: int

try:
user = User(name=123, age="hello") # 型が合ってない
except ValidationError as e:
print("エラーが出ました!")
print(e)

✅ これだけでも、エラーの内容は表示されます。でも、ちょっと見づらいですよね。


◆ .errors() を使って、エラーを見やすくしよう!

PydanticのValidationErrorには、.errors()という便利なメソッドがついています。
これを使うと、エラーの内容をリスト+辞書形式
で取り出せます。

except ValidationError as e:
print(e.errors())

👀 出力例:

[
{'loc': ('name',), 'msg': 'str type expected', 'type': 'type_error.str'},
{'loc': ('age',), 'msg': 'value is not a valid integer', 'type': 'type_error.integer'}
]
  • loc: どのフィールドでエラーが出たか
  • msg: エラーメッセージ
  • type: エラーの種類

こうやって見ると、「ああ、nameageの型がおかしいんだな」ってすぐにわかります!


◆ pprintでさらに見やすく!

エラー情報はたくさんあると読みにくくなります。そんなときは、pprintモジュールを使って、きれいに整形表示しちゃいましょう!

from pprint import pprint

except ValidationError as e:
pprint(e.errors())

これで、見た目スッキリ! 読みやすさUPです💡


🌟まとめ:エラーは「読める形」で受け取ろう

  • ValidationError.errors() で構造化された情報が取れる
  • loc, msg, type でエラーの場所・理由・種類がすぐわかる
  • pprintを使えば表示もきれい!



6. バリデーションルールを追加しよう|数値・文字列・日付

前のセクションでは、Pydanticの「型チェック」と「エラーの扱い方」を紹介しましたね。
でも実はPydantic、もっと細かいルールまで設定できるんです!

たとえば…

  • 数値は「0以上100以下だけOK」にしたい
  • 文字列は「メールアドレスっぽい形」にしたい
  • 日付は「未来の日付だけ」受け付けたい

こういうチェックをとても簡単に追加できるのが、Pydanticの強みなんです💪


◆ 使い方は Field() に条件をつけるだけ!

Pydanticでは、インスタンス変数に Field() を使って、**さまざまな制限(バリデーションルール)**を追加できます。

from pydantic import BaseModel, Field

class Product(BaseModel):
price: int = Field(ge=0, le=10000) # 0以上10000以下

ge=0は「0以上(Greater than or Equal)」
le=10000は「10000以下(Less than or Equal)」です!


◆ 数値に使えるバリデーション

条件引数意味
より大きいgt=値値より大きい(Greater Than)
以上ge=値値以上(Greater or Equal)
より小さいlt=値値より小さい(Less Than)
以下le=値値以下(Less or Equal)

👀 例:

score: int = Field(ge=0, le=100)  # 0〜100点のテストの点数

◆ 文字列に使えるバリデーション:正規表現

文字列に「この形じゃないとダメ!」というルールをつけたいときは、patternを使います。

たとえば、「郵便番号(7桁の数字)」をチェックしたいとき:

zipcode: str = Field(pattern=r"^\d{7}$")
  • \dは数字
  • {7}は「7文字ちょうど」
  • ^...$は「最初から最後まで」って意味です

◆ 日付に使えるバリデーション

未来の日付や過去の日付だけを受け付けたいときは、特別な型ヒントを使います!

from pydantic import BaseModel, FutureDate, PastDate
from datetime import date

class Event(BaseModel):
start_date: FutureDate # 今日より未来だけOK
created_at: PastDate # 過去の日付だけOK

これで、未来のイベントなのに「昨日の日付」とかを指定したらエラーになります!


◆ デフォルト値も Field() でOK!

Field()最初の引数に値を入れると、それが**初期値(デフォルト)**になります。

quantity: int = Field(1, ge=1, le=10)  # 初期値1、1〜10の間だけOK

🌟まとめ:Pydanticなら「ルール作り」もラクラク!

  • Field()を使えば、細かい条件もすぐに設定できる
  • 数値や文字列、日付などによくあるバリデーションもサポート済み
  • デフォルト値との組み合わせもバッチリ!



7. 値の変更を禁止する|frozenモードで読み取り専用に

ここまでで、Pydanticが**「データをチェックする仕組み」**としてすごく便利なことがわかってきましたね。

でも、「データを受け取ったあと、間違えて変更されちゃうと困る…!」
そんなときはどうしたらいいのでしょうか?

Pydanticには、**「この値は後から変えられないようにする」**という機能もあるんです!
それが「frozen(フローズン)モード」です🍦


◆ 特定の値だけ変更できないようにする(フィールド単位)

まずは、特定の変数(インスタンス変数)だけ「読み取り専用」にする方法です。

from pydantic import BaseModel, Field

class User(BaseModel):
name: str = Field(frozen=True) # この値は変更できない
age: int

この設定をすると、nameを変更しようとしたときにエラーになります👇

user = User(name="田中", age=25)
user.name = "佐藤" # ❌ エラーが出ます!

でも、ageは普通に変更できます。

user.age = 26  # ⭕


◆ クラス全体を「完全に変更不可」にする

「全部の値を一度決めたら変更不可にしたい!」というときは、**クラス全体を凍結(frozen)**できます。

そのためには、ConfigDictという設定を使います。

from pydantic import BaseModel, ConfigDict

class Product(BaseModel):
name: str
price: int

model_config = ConfigDict(frozen=True)

この設定を入れると、どの変数も変更できなくなります。

item = Product(name="りんご", price=100)
item.price = 200 # ❌ エラーになります!

こうすることで、「受け取ったデータを安全にそのまま保持したい!」という場面でとっても役立ちます。


◆ どんなときに使うの?

  • ユーザーIDや商品コードなど、一度決めたら変えてはいけないデータ
  • 外部から受け取ったデータをそのまま保持しておきたい場合
  • 誤って値を変えてしまうのをプログラムで防ぎたいとき

「frozen」は、そんな時に頼れる仕組みです💪


🌟まとめ:値を変えさせない=バグ防止の第一歩!

  • Field(frozen=True) で特定の値だけ変更不可にできる
  • ConfigDict(frozen=True) でクラス全体を読み取り専用にできる
  • セキュリティやデータ保護の観点でもとても便利!



8. 独自ルールの追加|オリジナルバリデーションの書き方

ここまでで、Pydanticが用意している便利なチェック機能(バリデーション)をいろいろ紹介してきましたね!

でも、場合によってはこんなこともあります。

「数字のチェックだけじゃ足りない…」
「“パスワードには必ず英数字が混ざってないとダメ”みたいなルールを作りたい!」

そういうときこそ、自分でルール(バリデーション)を書く出番です!
Pydanticでは、独自のバリデーション関数をクラスに追加することで、好きなチェック処理ができます🙌


◆ 使い方は @field_validator() を使うだけ!

まずは使い方の全体イメージから👇

from pydantic import BaseModel, field_validator

class User(BaseModel):
username: str

@field_validator('username')
@classmethod
def check_username(cls, value):
if " " in value:
raise ValueError("ユーザー名に空白は使えません!")
return value

💡ポイント:

  • @field_validator('変数名') ← ここでチェックしたい変数を指定
  • デコレーターの下にクラスメソッドを定義(@classmethod
  • チェックに失敗したらエラーを出す(raise ValueError
  • 問題なければ、そのまま値をreturn

◆ 実行してみよう!

user = User(username="tanaka taro")  # 空白入り → ❌エラー!
user = User(username="tanaka_taro")  # OK!🙆‍♀️

◆ 複数の変数をまとめてチェックしたいときは?

例えば「パスワードと確認用パスワードが同じかチェックしたい」みたいな場合は、@model_validator(mode='after') というモデル全体をチェックする方法があります。今回はフィールドバリデーションがメインなので、ここでは割愛しますが、ご希望あれば後日解説します!


◆ どんなときに使うの?

  • 入力値に特定のルールを強制したいとき
  • 既存のバリデーションではチェックしきれない条件があるとき
  • 独自のロジックを入れたいとき(例:メールアドレスが社内ドメインかどうか)

🌟まとめ:自由にルールを作れるから、実用度MAX!

  • @field_validator()好きな条件を設定できる
  • 条件を満たさなければ ValueError を使ってエラーにする
  • すごく柔軟だから、どんなプロジェクトにもフィットする!



9. データの入出力|辞書・JSONとのシームレスな連携

さて、ここまででPydanticの「データチェック」についてたっぷり学んできましたが…

「じゃあ、そのデータを辞書にしたり、JSONにしたりってできるの?」
「APIで送ったり、ファイルに保存したり、そういうこともできるの?」

はい!Pydanticなら、そのへんもめちゃくちゃカンタンです😊

この章では、Pydanticモデルと辞書やJSONとの変換方法をマスターしていきましょう!


◆ オブジェクトから辞書に変換する

Pydanticのオブジェクトを辞書にしたいときは、.model_dump() を使います!

from pydantic import BaseModel

class User(BaseModel):
name: str
age: int

user = User(name="佐藤", age=28)
user_dict = user.model_dump()

print(user_dict)

✅ 結果:

{'name': '佐藤', 'age': 28}

Pythonのdictとまったく同じ形で使えます!


◆ オブジェクトからJSON文字列に変換する

「辞書」じゃなくて「JSON文字列」にしたいときは .model_dump_json() を使います👇

user_json = user.model_dump_json()
print(user_json)

✅ 結果:

{"name": "佐藤", "age": 28}

このままAPIに送ったり、ファイルに保存したりできます!


◆ 辞書やJSONからPydanticオブジェクトを作る

逆に、「外から受け取ったデータをPydanticモデルに変換したい!」という場合もありますよね?

辞書から作るときは、次のように **辞書 を渡します:

data = {"name": "田中", "age": 35}
user = User(**data)

JSON文字列から作るときは .model_validate_json() を使います!

json_data = '{"name": "鈴木", "age": 22}'
user = User.model_validate_json(json_data)

もちろん、このときもバリデーションがしっかり行われるので、安心です👌


🌟まとめ:データの変換もPydanticにおまかせ!

やりたいこと使うメソッド
オブジェクト → 辞書.model_dump()
オブジェクト → JSON文字列.model_dump_json()
辞書 → オブジェクトYourModel(**your_dict)
JSON → オブジェクト.model_validate_json()

Pydanticがあれば、データチェック+変換も一括でOK!
もうバグやミスで悩まされることも少なくなります✨




10. まとめ|Pydanticを使って安全で信頼性の高いコードに

ここまで読んでくださって、ありがとうございました!
この記事では、**Pydantic(パイダンティック)**というPythonライブラリを使って、**データのチェック(バリデーション)**をどうやって行うかをやさしく解説してきました。


💡Pydanticってどんなものだった?

  • Pythonのクラスに型ヒントをつけるだけで自動チェック
  • 間違ったデータが入らないように守ってくれる頼れる存在!
  • さらに、
    • 自動型変換
    • 厳密なチェック(strict)
    • エラーの見やすい出力
    • 独自ルールの追加
    • 辞書やJSONとの変換
    • 値を凍結して変更禁止にする設定
      …などなど、超実用的な機能がたくさん!

🛠 こんなときにPydanticを使うと◎

  • ユーザーからの入力をチェックしたいとき
  • 外部APIから来たデータを検証したいとき
  • Webアプリでフォーム入力を安全に扱いたいとき
  • FastAPIなどのフレームワークと組み合わせて使うとき

Pydanticは、Pythonコードに**安心・安全という「盾」**を与えてくれるツールです。最初はちょっと難しそうに見えるかもしれませんが、使い始めるとその便利さにびっくりします!

あなたのPythonコードも、Pydanticでもっとスマートに、もっと安全にしていきましょう😊


✅ あわせて読みたい|関連記事リンク集

Pydanticを学んだあなたにおすすめしたい、関連する記事はこちらです👇


よくある質問(Q&A)

Q
Pydanticって無料で使えるの?
A

はい、Pydanticはオープンソースで、誰でも無料で使えます!商用プロジェクトでもOKです。

Q
FastAPIと一緒に使うことが多いって本当?
A

本当です!FastAPIはPydanticと組み合わせて使うことを前提に設計されているため、相性バツグンです。

Q
PydanticはどのPythonバージョンに対応していますか?
A

Pydantic v2以降はPython 3.8以上に対応しています。v1系なら3.7でもOKです。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク