Pydantic¶
Pydanticは、Pythonで最も広く使用されているデータ検証ライブラリです。
高速で拡張可能なPydanticは、リンター/IDE/あなたの頭脳とうまく連携します。純粋で標準的なPython 3.8+でのデータのあり方を定義し、Pydanticで検証します。
Migrating to Pydantic V2
Pydantic V1の使用?アプリケーションでのPydantic V2へのアップグレードに関する注意事項については、Migration Guideを参照してください。
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スキーマを生成できるため、他のツールと簡単に統合できます。詳細はこちら
- StrictとLaxモード — Pydanticは、
strict=True
モード(データが変換されない)またはstrict=False
モード(Pydanticがデータを適切な型に強制的に変換しようとする)のいずれかで実行できます。詳細はこちら
- Dataclasses,TypedDitcsなど — Pydanticは
dataclass
やTypedDict
を含む多くの標準ライブラリ型の検証をサポートしています。詳細はこちら
- カスタマイズ — 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
から継承するカスタムクラスを作成する簡単な例から始めましょう。
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},
}
"""
id
はint
型です。注釈のみの宣言は、このフィールドが必須であることをPydanticに伝えます。文字列、バイト、または浮動小数点は、可能であればintに強制されます。そうでない場合は例外が発生します。name
は文字列です。デフォルトがあるので、必須ではありません。signup_ts
はdatetime
フィールドで必須ですが、値None
を指定することもできます。 PydanticはUNIXのタイムスタンプint(例えば1496498400
)か、日付と時刻を表す文字列を処理します。taste
は文字列キーと正の整数値を持つ辞書です。PositiveInt
型はAnnotated[int, annotated_types.Gt(0)]
の省略形です。- ここでの入力はISO8601フォーマットのdatetimeで、Pydanticはこれを
datetime
オブジェクトに変換します。 - ここで重要なのは
bytes
ですが、Pydanticはこれを文字列に強制的に変換します。 - 同様に、Pydanticは文字列"1"を整数"1"に強制的に変換します。
- ここでは、外部データをキーワード引数として
User
に渡すことによってUser
のインスタンスを作成します。 - モデルの属性としてフィールドにアクセスできます。
- モデルを辞書に変換するには
model_dump()
を使用します。
検証が失敗した場合、Pydanticは何が間違っていたかの詳細を示すエラーを発生させます:
# 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',
},
]
"""
- 入力データが間違っています—
id
は有効な整数ではなく、signup_ts
がありません。 User(...)
はエラーのリストと共にValidationError
を発生させます。
Who is using Pydantic?¶
何百もの組織やパッケージがPydanticを使用しています。こちらがPydanticを使用している世界中の著名な企業や組織です。
私家版訳注
以下は、翻訳時点のものです。(2024/07)
Pydanticを使用したオープンソースプロジェクトのより包括的なリストについては list of dependents on github、またはawesome-pydanticでPydanticを使用している素晴らしいプロジェクトを見つけることができます。