Перейти к содержанию

Адаптер типов

У вас могут быть типы, не являющиеся BaseModel , по которым вы хотите проверять данные. Или вы можете проверить List[SomeModel] или сохранить его в JSON.

??? API "Документация по API" pydantic.type_adapter.TypeAdapter

Для подобных случаев использования Pydantic предоставляет TypeAdapter, который можно использовать для проверки типа, сериализации и генерации схемы JSON без необходимости создания BaseModel.

Экземпляр 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 » Методы dump_json TypeAdapter возвращают объект bytes , в отличие от соответствующего метода для BaseModel , model_dump_json , который возвращает str . Причина этого несоответствия заключается в том, что в версии 1 дамп модели возвращал тип str, поэтому это поведение сохраняется в версии 2 для обратной совместимости. В случае BaseModel bytes приводятся к типам str , но bytes часто являются желаемым конечным типом. Следовательно, для нового класса TypeAdapter в V2 тип возвращаемого значения — это просто 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 для данного типа только один раз и повторно использовать его в циклах или другом коде, критичном к производительности.


本文总阅读量