Aller au contenu

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.


本文总阅读量