Adaptateur de type
Vous pouvez avoir des types qui ne sont pas BaseModel
par rapport auxquels vous souhaitez valider les données. Ou vous souhaiterez peut-être valider un List[SomeModel]
ou le transférer vers JSON.
??? API "Documentation API" pydantic.type_adapter.TypeAdapter
Pour des cas d'utilisation comme celui-ci, Pydantic fournit TypeAdapter
, qui peut être utilisé pour la validation de type, la sérialisation et la génération de schéma JSON sans avoir besoin de créer un BaseModel
.
Une instance TypeAdapter
expose certaines fonctionnalités des méthodes d'instance BaseModel
pour les types qui n'ont pas de telles méthodes (comme les classes de données, les types primitifs, etc.):
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
renvoie bytes
" Les méthodes dump_json
de TypeAdapter
renvoient un objet bytes
, contrairement à la méthode correspondante pour BaseModel
, model_dump_json
, qui renvoie un str
. La raison de cette différence est que dans la V1, le dumping de modèle renvoyait un type str, ce comportement est donc conservé dans la V2 pour des raisons de compatibilité ascendante. Pour le cas BaseModel
, bytes
sont contraints aux types str
, mais bytes
sont souvent le type de fin souhaité. Par conséquent, pour la nouvelle classe TypeAdapter
de la V2, le type de retour est simplement bytes
, qui peut facilement être contraint à un type str
si vous le souhaitez.
!!! note Malgré certains chevauchements dans les cas d'utilisation avec RootModel
, TypeAdapter
ne doit pas être utilisé comme annotation de type pour spécifier les champs d'un BaseModel
, etc.
Analyser les données dans un type spécifié¶
TypeAdapter
peut être utilisé pour appliquer la logique d'analyse afin de remplir les modèles Pydantic de manière plus ad hoc. Cette fonction se comporte de la même manière que BaseModel.model_validate
, mais fonctionne avec des types arbitraires compatibles avec Pydantic.
Ceci est particulièrement utile lorsque vous souhaitez analyser les résultats dans un type qui n'est pas une sous-classe directe de BaseModel
. Par exemple:
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
est capable d'analyser les données dans n'importe lequel des types que Pydantic peut gérer en tant que champs d'un BaseModel
.
!!! info "Considérations sur les performances" Lors de la création d'une instance de TypeAdapter
, le type fourni doit être analysé et converti en un schéma pydantic-core. Cela s'accompagne d'une surcharge non triviale, il est donc recommandé de créer une seule fois un TypeAdapter
pour un type donné et de le réutiliser dans des boucles ou dans tout autre code critique en termes de performances.
本文总阅读量次