タイプアダプター
データを検証する対象となる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を返します " TypeAdapterのdump_jsonメソッドは、 strを返すBaseModelの対応するメソッドであるmodel_dump_jsonとは異なり、 bytesオブジェクトを返します。この不一致の理由は、V1 ではモデルのダンプが str 型を返したため、この動作は下位互換性のために V2 でも残されているためです。 BaseModelの場合、 bytes str型に強制されますが、多くの場合、 bytes望ましい終了型になります。したがって、V2 の新しいTypeAdapterクラスの場合、戻り値の型は単純にbytesとなり、必要に応じてstr型に簡単に強制できます。
!!! note RootModel とのユースケースには一部重複がありますが、TypeAdapter はBaseModelのフィールドなどを指定するための型アノテーションとして使用しないでください。
データを指定された型に解析する¶
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 回だけ作成し、ループまたはその他のパフォーマンスが重要なコードで再利用することをお勧めします。
本文总阅读量次