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.
本文总阅读量次