Ga naar inhoud

Type-adapter

Het kan zijn dat u typen heeft die geen BaseModel zijn en waartegen u gegevens wilt valideren. Of misschien wilt u een List[SomeModel] valideren, of deze naar JSON dumpen.

??? api "API-documentatie" pydantic.type_adapter.TypeAdapter

Voor gebruiksscenario's als deze biedt Pydantic TypeAdapter, die kan worden gebruikt voor typevalidatie, serialisatie en het genereren van JSON-schema's zonder dat er een BaseModel hoeft te worden gemaakt.

Een TypeAdapter instantie stelt een deel van de functionaliteit bloot van BaseModel instantiemethoden voor typen die dergelijke methoden niet hebben (zoals dataclasses, primitieve typen en meer):

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 retourneert bytes " De dump_json -methoden van TypeAdapter retourneren een bytes object, in tegenstelling tot de overeenkomstige methode voor BaseModel , model_dump_json , die een str retourneert. De reden voor deze discrepantie is dat modeldumping in V1 een str-type retourneerde, dus dit gedrag blijft in V2 behouden voor achterwaartse compatibiliteit. In het geval van BaseModel worden bytes gedwongen tot str -typen, maar bytes zijn vaak het gewenste eindtype. Voor de nieuwe klasse TypeAdapter in V2 is het retourtype dus eenvoudigweg bytes , dat desgewenst gemakkelijk kan worden gedwongen tot een str type.

!!! opmerking Ondanks enige overlap in gebruiksscenario's met RootModel, mag TypeAdapter niet worden gebruikt als typeannotatie voor het specificeren van velden van een BaseModel , enz.

Gegevens parseren in een opgegeven type

TypeAdapter kan worden gebruikt om de parseerlogica toe te passen om Pydantic-modellen op een meer ad-hoc manier te vullen. Deze functie gedraagt zich op dezelfde manier als BaseModel.model_validate, maar werkt met willekeurige Pydantic-compatibele typen.

Dit is vooral handig als u resultaten wilt parseren naar een type dat geen directe subklasse is van BaseModel. Bijvoorbeeld:

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 kan gegevens parseren in elk van de typen die Pydantic kan verwerken als velden van een BaseModel.

!!! info "Prestatieoverwegingen" Bij het maken van een exemplaar van TypeAdapter moet het opgegeven type worden geanalyseerd en omgezet in een pydantic-core-schema. Dit brengt wat niet-triviale overhead met zich mee, dus het wordt aanbevolen om slechts één keer een TypeAdapter voor een bepaald type te maken en deze opnieuw te gebruiken in loops of andere prestatiekritische code.


本文总阅读量