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