コンテンツにスキップ

タイプアダプター

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

??? API「APIドキュメント」 pydantic.type_adapter.TypeAdapter

このようなユースケースのために、Pydantic は TypeAdapter を提供します。これは、BaseModel を作成することなく、型の検証、シリアル化、および JSON スキーマの生成に使用できます。

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}]'

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

!!! note RootModel とのユースケースには一部重複がありますが、TypeAdapterBaseModelのフィールドなどを指定するための型アノテーションとして使用しないでください。

データを指定された型に解析する

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 は、Pydantic が BaseModel のフィールドとして処理できる任意の型にデータを解析できます。

!!! info "パフォーマンスに関する考慮事項" TypeAdapterのインスタンスを作成するときは、指定された型を分析して pydantic-core スキーマに変換する必要があります。これには重大なオーバーヘッドが伴うため、特定の型のTypeAdapter 1 回だけ作成し、ループまたはその他のパフォーマンスが重要なコードで再利用することをお勧めします。


本文总阅读量