タイプアダプター
データを検証する対象となる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 回だけ作成し、ループまたはその他のパフォーマンスが重要なコードで再利用することをお勧めします。
本文总阅读量次