Адаптер типов
У вас могут быть типы, не являющиеся 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
для данного типа только один раз и повторно использовать его в циклах или другом коде, критичном к производительности.
本文总阅读量次