- 1. はじめに|PydanticでPythonコードの安全性を高めよう
- 2. Pydanticとは?|データクラスより強力な型チェックツール
- 3. 基本の使い方|型ヒントによる自動バリデーション
- 4. より厳密なチェックを行う|strictモードと型制限
- 5. 実行時エラーを扱う|構造化されたエラーハンドリング
- 6. バリデーションルールを追加しよう|数値・文字列・日付
- 7. 値の変更を禁止する|frozenモードで読み取り専用に
- 8. 独自ルールの追加|オリジナルバリデーションの書き方
- 9. データの入出力|辞書・JSONとのシームレスな連携
- 10. まとめ|Pydanticを使って安全で信頼性の高いコードに
- よくある質問(Q&A)
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: エラーの種類
こうやって見ると、「ああ、nameとageの型がおかしいんだな」ってすぐにわかります!
◆ 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を学んだあなたにおすすめしたい、関連する記事はこちらです👇
- 🔗 【初心者向け】FastAPIの基本の使い方をやさしく解説|最速で始めるPythonのWeb開発
→ Pydanticとの相性抜群なWebフレームワーク「FastAPI」の入門編! - 🔗 【初心者向け】SyntaxErrorとは?よくある書き間違いと直し方を徹底解説
→ 「エラーで止まった!」という時にまず読んでほしいエラー対策ガイド。 - 🔗 Python初心者がよくつまずくエラー10選と解決法まとめ|原因から対処法までやさしく解説
→ 初心者がつまずきやすいエラーを先回りして解決! - 🔗 Pythonのprintデバッグ活用術|初心者でもできるエラー解決の第一歩
→ バリデーションと合わせて「デバッグ力」も高めよう!
よくある質問(Q&A)
- QPydanticって無料で使えるの?
- A
はい、Pydanticはオープンソースで、誰でも無料で使えます!商用プロジェクトでもOKです。
- QFastAPIと一緒に使うことが多いって本当?
- A
本当です!FastAPIはPydanticと組み合わせて使うことを前提に設計されているため、相性バツグンです。
- QPydanticはどのPythonバージョンに対応していますか?
- A
Pydantic v2以降はPython 3.8以上に対応しています。v1系なら3.7でもOKです。







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。