Type Adapter
BaseModel
ではない型に対してデータを検証したい場合があります。
あるいはList[SomeModel]
を検証したり、JSONにダンプしたりすることもできます。
API Documentation
このようなユースケースのために、PydanticはBaseModel
を作成することなく、型検証、シリアライゼーション、JSONスキーマ生成に使用できるTypeAdapter
を提供しています。
TypeAdapter
インスタンスは、BaseModel
インスタンスメソッドの機能の一部を、そのようなメソッドを持たない型(データクラス、プリミティブ型など)に対して公開します。
from typing import List
from typing_extensions import TypedDict
from pydantic import TypeAdapter, ValidationError
class User(TypedDict):
name: str
id: int
user_list_adapter = TypeAdapter(List[User])
user_list = user_list_adapter.validate_python([{'name': 'Fred', 'id': '3'}])
print(repr(user_list))
#> [{'name': 'Fred', 'id': 3}]
try:
user_list_adapter.validate_python(
[{'name': 'Fred', 'id': 'wrong', 'other': 'no'}]
)
except ValidationError as e:
print(e)
"""
1 validation error for list[typed-dict]
0.id
Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='wrong', input_type=str]
"""
print(repr(user_list_adapter.dump_json(user_list)))
#> b'[{"name":"Fred","id":3}]'
dump_json
returns bytes
TypeAdapter
のdump_json
メソッドはbytes
オブジェクトを返しますが、これに対応するBaseModel
のmodel_dump_json
メソッドはstr
を返します。
この不一致の理由は、V1ではモデルダンプがstr型を返したため、この動作は下位互換性のためにV2でも保持されているためです。
BaseModel
の場合、bytes
はstr
型に強制的に変換されますが、多くの場合bytes
が望ましい終了型です。
したがって、V2の新しいTypeAdapter
クラスでは、戻り値の型は単にbytes
であり、必要に応じてstr
型に簡単に強制できます。
Note
RootModel
とユースケースが重複していますが、TypeAdapter
はBaseModel
などのフィールドを指定するための型注釈として使用すべきではありません。
Parsing data into a specified type¶
TypeAdapter
を使用すると、解析ロジックを適用して、よりアドホックな方法でPydanticモデルを作成できます。この関数はBaseModel.model_validate
と同じように動作しますが、任意のPydantic互換型で動作します。
これは、BaseModel
の直接のサブクラスではない型に結果を解析したい場合に特に便利です。例えば:
from typing import List
from pydantic import BaseModel, TypeAdapter
class Item(BaseModel):
id: int
name: str
# `item_data` could come from an API call, eg., via something like:
# item_data = requests.get('https://my-api.com/items').json()
item_data = [{'id': 1, 'name': 'My Item'}]
items = TypeAdapter(List[Item]).validate_python(item_data)
print(items)
#> [Item(id=1, name='My Item')]
TypeAdapter
is capable of parsing data into any of the types Pydantic can handle as fields of a BaseModel
.
TypeAdapter
は、PydanticがBaseModel
のフィールドとして処理できる任意の型にデータを解析することができます。
Performance considerations
TypeAdapter
のインスタンスを作成する場合、提供された型を解析し、pydantic-coreスキーマに変換する必要があります。これにはいくつかの重要なオーバーヘッドが伴うため、特定の型に対してTypeAdapter
を一度だけ作成し、ループやその他のパフォーマンスが重要なコードで再利用することをお勧めします。