Typadapter
Möglicherweise haben Sie Typen, die keine BaseModel
sind, gegen die Sie Daten validieren möchten. Oder Sie möchten vielleicht ein List[SomeModel]
validieren oder es in JSON ausgeben.
??? API „API-Dokumentation“ pydantic.type_adapter.TypeAdapter
Für Anwendungsfälle wie diesen stellt Pydantic TypeAdapter
bereit, der zur Typvalidierung, Serialisierung und JSON-Schemagenerierung verwendet werden kann, ohne dass ein BaseModel
erstellt werden muss.
Eine TypeAdapter
-Instanz stellt einige der Funktionen von BaseModel
-Instanzmethoden für Typen bereit, die nicht über solche Methoden verfügen (z. B. Datenklassen, primitive Typen und mehr):
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
gibt bytes
zurück“ Die dump_json
-Methoden von TypeAdapter
geben ein bytes
Objekt zurück, im Gegensatz zur entsprechenden Methode für BaseModel
, model_dump_json
, die ein str
zurückgibt. Der Grund für diese Diskrepanz liegt darin, dass in Version 1 beim Modell-Dumping ein str-Typ zurückgegeben wurde, sodass dieses Verhalten aus Gründen der Abwärtskompatibilität in Version 2 beibehalten wird. Im BaseModel
Fall werden bytes
in str
-Typen umgewandelt, bytes
sind jedoch häufig der gewünschte Endtyp. Daher ist der Rückgabetyp für die neue TypeAdapter
-Klasse in V2 einfach bytes
, der bei Bedarf leicht in einen str
Typ umgewandelt werden kann.
!!! Hinweis Trotz einiger Überschneidungen in Anwendungsfällen mit RootModel
sollte TypeAdapter
nicht als Typanmerkung zum Angeben von Feldern eines BaseModel
usw. verwendet werden.
Analysieren von Daten in einen angegebenen Typ¶
TypeAdapter
kann verwendet werden, um die Parsing-Logik anzuwenden, um Pydantic-Modelle eher ad-hoc zu füllen. Diese Funktion verhält sich ähnlich wie BaseModel.model_validate
, funktioniert jedoch mit beliebigen Pydantic-kompatiblen Typen.
Dies ist besonders nützlich, wenn Sie Ergebnisse in einen Typ analysieren möchten, der keine direkte Unterklasse von BaseModel
ist. Zum Beispiel:
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
ist in der Lage, Daten in jeden der Typen zu analysieren, die Pydantic als Felder eines BaseModel
verarbeiten kann.
!!! info „Leistungsüberlegungen“ Beim Erstellen einer Instanz von TypeAdapter
muss der bereitgestellte Typ analysiert und in ein Pydantic-Core-Schema konvertiert werden. Dies bringt einen nicht unerheblichen Mehraufwand mit sich, daher wird empfohlen, einen TypeAdapter
für einen bestimmten Typ nur einmal zu erstellen und ihn in Schleifen oder anderem leistungskritischen Code wiederzuverwenden.
本文总阅读量次