コンテンツにスキップ

Type Adapter

BaseModelではない型に対してデータを検証したい場合があります。 あるいはList[SomeModel]を検証したり、JSONにダンプしたりすることもできます。

API Documentation

pydantic.type_adapter.TypeAdapter

このようなユースケースのために、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

TypeAdapterdump_jsonメソッドはbytesオブジェクトを返しますが、これに対応するBaseModelmodel_dump_jsonメソッドはstrを返します。 この不一致の理由は、V1ではモデルダンプがstr型を返したため、この動作は下位互換性のためにV2でも保持されているためです。 BaseModelの場合、bytesstr型に強制的に変換されますが、多くの場合bytesが望ましい終了型です。 したがって、V2の新しいTypeAdapterクラスでは、戻り値の型は単にbytesであり、必要に応じてstr型に簡単に強制できます。

Note

RootModelとユースケースが重複していますが、TypeAdapterBaseModelなどのフィールドを指定するための型注釈として使用すべきではありません。

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を一度だけ作成し、ループやその他のパフォーマンスが重要なコードで再利用することをお勧めします。