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