Lewati ke isi

Adaptor Jenis

Anda mungkin memiliki tipe yang bukan BaseModel yang ingin Anda validasi datanya. Atau Anda mungkin ingin memvalidasi List[SomeModel] , atau membuangnya ke JSON.

??? api "Dokumentasi API" pydantic.type_adapter.TypeAdapter

Untuk kasus penggunaan seperti ini, Pydantic menyediakan TypeAdapter, yang dapat digunakan untuk validasi tipe, serialisasi, dan pembuatan skema JSON tanpa perlu membuat BaseModel.

Instance TypeAdapter memperlihatkan beberapa fungsi dari metode instance BaseModel untuk tipe yang tidak memiliki metode tersebut (seperti kelas data, tipe primitif, dan lainnya):

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 mengembalikan bytes " Metode dump_json TypeAdapter mengembalikan objek bytes , tidak seperti metode yang sesuai untuk BaseModel , model_dump_json , yang mengembalikan str . Alasan perbedaan ini adalah di V1, model dumping mengembalikan tipe str, sehingga perilaku ini dipertahankan di V2 untuk kompatibilitas ke belakang. Untuk kasus BaseModel , bytes dipaksa menjadi tipe str , tetapi bytes sering kali merupakan tipe akhir yang diinginkan. Oleh karena itu, untuk kelas TypeAdapter baru di V2, tipe yang dikembalikan hanyalah bytes , yang dapat dengan mudah dipaksa menjadi tipe str jika diinginkan.

!!! catatan Meskipun ada beberapa kasus penggunaan yang tumpang tindih dengan RootModel, TypeAdapter tidak boleh digunakan sebagai anotasi tipe untuk menentukan bidang BaseModel , dll.

Mengurai data ke dalam tipe tertentu

TypeAdapter dapat digunakan untuk menerapkan logika parsing untuk mengisi model Pydantic dengan cara yang lebih ad-hoc. Fungsi ini berperilaku mirip dengan BaseModel.model_validate, tetapi bekerja dengan tipe yang kompatibel dengan Pydantic sewenang-wenang.

Ini sangat berguna ketika Anda ingin mengurai hasil menjadi tipe yang bukan merupakan subkelas langsung dari BaseModel. Misalnya:

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 mampu mengurai data ke dalam salah satu tipe yang dapat ditangani Pydantic sebagai bidang BaseModel.

!!! info "Pertimbangan kinerja" Saat membuat instance TypeAdapter , tipe yang disediakan harus dianalisis dan diubah menjadi skema inti pydantic. Ini disertai dengan beberapa overhead non-sepele, jadi disarankan untuk membuat TypeAdapter untuk tipe tertentu sekali saja dan menggunakannya kembali dalam loop atau kode penting kinerja lainnya.


本文总阅读量