コンテンツにスキップ

Pydantic

Pydanticは、Pythonで最も広く使用されているデータ検証ライブラリです。

高速で拡張可能なPydanticは、リンター/IDE/あなたの頭脳とうまく連携します。純粋で標準的なPython 3.8+でのデータのあり方を定義し、Pydanticで検証します。

Migrating to Pydantic V2

Pydantic V1の使用?アプリケーションでのPydantic V2へのアップグレードに関する注意事項については、Migration Guideを参照してください。

Pydantic Example
from datetime import datetime
from typing import Tuple

from pydantic import BaseModel


class Delivery(BaseModel):
    timestamp: datetime
    dimensions: Tuple[int, int]


m = Delivery(timestamp='2020-01-02T03:04:05Z', dimensions=['10', '20'])
print(repr(m.timestamp))
#> datetime.datetime(2020, 1, 2, 3, 4, 5, tzinfo=TzInfo(UTC))
print(m.dimensions)
#> (10, 20)

Why is Pydantic named the way it is?

"Pydantic"という名前は、"Py"と"pedantic"の合成語です。"Py"の部分は、ライブラリがPythonに関連付けられていることを示します。 "pedantic"とは、データ検証と型強制に対するライブラリの細心の注意を払ったアプローチを指します。

これらの要素を組み合わせて、"Pydantic"は、詳細指向で厳密なデータ検証を提供するPythonライブラリを提供している。

私たちは、Pydantic V1がその検証において厳密ではなかったという皮肉を認識しているので、私たちは物知り顔で、"Pydantic"はV2が登場するまでは誤った名称であったと言えたはずです。

Why use Pydantic?

  • 型ヒントを使用 — Pydanticでは、スキーマの検証とシリアライゼーションは型アノテーションによって制御されます。学習するコードが少なくなり、作成するコードも少なくなり、IDEや静的解析ツールと統合されます。詳細はこちら
  • スピード — Pydanticのコア検証ロジックはRustで記述されています。その結果、PydanticはPython用の最速のデータ検証ライブラリの1つになっています。詳細はこちら
  • JSONスキーマ — PydanticモデルはJSONスキーマを生成できるため、他のツールと簡単に統合できます。詳細はこちら
  • StrictLaxモード — Pydanticは、strict=Trueモード(データが変換されない)またはstrict=Falseモード(Pydanticがデータを適切な型に強制的に変換しようとする)のいずれかで実行できます。詳細はこちら
  • Dataclasses,TypedDitcsなど — PydanticはdataclassTypedDictを含む多くの標準ライブラリ型の検証をサポートしています。詳細はこちら
  • カスタマイズ — Pydanticを使用すると、カスタムバリデータとシリアライザを使用して、さまざまな強力な方法でデータの処理方法を変更できます。詳細はこちら
  • Ecosystem — PyPI上の約8,000のパッケージがPydanticを使用しており、その中には以下のような非常に人気のあるライブラリが含まれています。 FastAPI,hugggingface,Django Ninja,SQLModel,LangChain.詳細はこちら
  • 実戦テスト済み — Pydanticは7,000万回/月以上ダウンロードされ、すべてのFAANG企業とNASDAQの上位25社のうち20社で使用されています。Pydanticで何かをしようとしているのであれば、おそらく他の誰かがすでにそれをしています。 Learn more…

インストールはとてもシンプルです。 Installing Pydantic : pip install pydantic

Pydantic examples

Pydanticの動作を確認するために、BaseModelから継承するカスタムクラスを作成する簡単な例から始めましょう。

Validation Successful
from datetime import datetime

from pydantic import BaseModel, PositiveInt


class User(BaseModel):
    id: int  # (1)!
    name: str = 'John Doe'  # (2)!
    signup_ts: datetime | None  # (3)!
    tastes: dict[str, PositiveInt]  # (4)!


external_data = {
    'id': 123,
    'signup_ts': '2019-06-01 12:22',  # (5)!
    'tastes': {
        'wine': 9,
        b'cheese': 7,  # (6)!
        'cabbage': '1',  # (7)!
    },
}

user = User(**external_data)  # (8)!

print(user.id)  # (9)!
#> 123
print(user.model_dump())  # (10)!
"""
{
    'id': 123,
    'name': 'John Doe',
    'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
    'tastes': {'wine': 9, 'cheese': 7, 'cabbage': 1},
}
"""
  1. idint型です。注釈のみの宣言は、このフィールドが必須であることをPydanticに伝えます。文字列、バイト、または浮動小数点は、可能であればintに強制されます。そうでない場合は例外が発生します。
  2. nameは文字列です。デフォルトがあるので、必須ではありません。
  3. signup_tsdatetimeフィールドで必須ですが、値Noneを指定することもできます。 PydanticはUNIXのタイムスタンプint(例えば1496498400)か、日付と時刻を表す文字列を処理します。
  4. tasteは文字列キーと正の整数値を持つ辞書です。PositiveInt型はAnnotated[int, annotated_types.Gt(0)]の省略形です。
  5. ここでの入力はISO8601フォーマットのdatetimeで、Pydanticはこれをdatetimeオブジェクトに変換します。
  6. ここで重要なのはbytesですが、Pydanticはこれを文字列に強制的に変換します。
  7. 同様に、Pydanticは文字列"1"を整数"1"に強制的に変換します。
  8. ここでは、外部データをキーワード引数としてUserに渡すことによってUserのインスタンスを作成します。
  9. モデルの属性としてフィールドにアクセスできます。
  10. モデルを辞書に変換するにはmodel_dump()を使用します。

検証が失敗した場合、Pydanticは何が間違っていたかの詳細を示すエラーを発生させます:

Validation Error
# continuing the above example...

from pydantic import ValidationError


class User(BaseModel):
    id: int
    name: str = 'John Doe'
    signup_ts: datetime | None
    tastes: dict[str, PositiveInt]


external_data = {'id': 'not an int', 'tastes': {}}  # (1)!

try:
    User(**external_data)  # (2)!
except ValidationError as e:
    print(e.errors())
    """
    [
        {
            'type': 'int_parsing',
            'loc': ('id',),
            'msg': 'Input should be a valid integer, unable to parse string as an integer',
            'input': 'not an int',
            'url': 'https://errors.pydantic.dev/2/v/int_parsing',
        },
        {
            'type': 'missing',
            'loc': ('signup_ts',),
            'msg': 'Field required',
            'input': {'id': 'not an int', 'tastes': {}},
            'url': 'https://errors.pydantic.dev/2/v/missing',
        },
    ]
    """
  1. 入力データが間違っています—idは有効な整数ではなく、signup_tsがありません。
  2. User(...)はエラーのリストと共にValidationErrorを発生させます。

Who is using Pydantic?

何百もの組織やパッケージがPydanticを使用しています。こちらがPydanticを使用している世界中の著名な企業や組織です。

私家版訳注

以下は、翻訳時点のものです。(2024/07)

Pydanticを使用したオープンソースプロジェクトのより包括的なリストについては list of dependents on github、またはawesome-pydanticでPydanticを使用している素晴らしいプロジェクトを見つけることができます。