Zum Inhalt

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.


本文总阅读量