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