Fitur Eksperimental¶
Di bagian ini Anda akan menemukan dokumentasi untuk fitur eksperimental baru di Pydantic. Fitur-fitur ini dapat diubah atau dihapus, dan kami menantikan masukan dan saran sebelum menjadikannya bagian permanen dari Pydantic.
Lihat Kebijakan Versi kami untuk informasi lebih lanjut tentang fitur eksperimental.
Masukan¶
Kami menyambut masukan tentang fitur eksperimental! Silakan buka terbitan di repositori Pydantic GitHub untuk membagikan pemikiran, permintaan, atau saran Anda.
Kami juga mendorong Anda untuk membaca masukan yang ada dan menambahkan pemikiran Anda terhadap masalah yang ada.
Peringatan Impor¶
Saat Anda mengimpor fitur eksperimental dari modul experimental
, Anda akan melihat pesan peringatan bahwa fitur tersebut bersifat eksperimental. Anda dapat menonaktifkan peringatan ini dengan yang berikut ini:
import warnings
from pydantic import PydanticExperimentalWarning
warnings.filterwarnings('ignore', category=PydanticExperimentalWarning)
API Saluran Pipa¶
Pydantic v2.8.0 memperkenalkan API "pipeline" eksperimental yang memungkinkan penyusunan parsing (validasi), batasan, dan transformasi dengan cara yang lebih aman untuk tipe daripada API yang ada. API ini dapat diubah atau dihapus, kami mencari masukan dan saran sebelum menjadikannya bagian permanen dari Pydantic.
??? api "Dokumentasi API" [pydantic.experimental.pipeline
][pydantic.eksperimental.pipeline]
Umumnya, API pipeline digunakan untuk menentukan urutan langkah yang akan diterapkan pada data masuk selama validasi. API pipeline dirancang agar lebih aman untuk tipe dan dapat disusun dibandingkan API Pydantic yang sudah ada.
Setiap langkah dalam alur dapat berupa:
- Langkah validasi yang menjalankan validasi pydantic pada tipe yang disediakan
- Langkah transformasi yang mengubah data
- Langkah batasan yang memeriksa data terhadap suatu kondisi
- Langkah predikat yang memeriksa data terhadap suatu kondisi dan memunculkan kesalahan jika mengembalikan
False
Perhatikan bahwa contoh berikut mencoba untuk menjadi lengkap dengan mengorbankan kompleksitas: jika Anda mendapati diri Anda menulis banyak transformasi dalam anotasi tipe, Anda mungkin ingin mempertimbangkan untuk memiliki model UserIn
dan UserOut
(contoh di bawah) atau serupa di mana Anda melakukan transformasi melalui idomatic kode Python biasa. API ini dimaksudkan untuk situasi di mana penghematan kode cukup besar dan kompleksitas tambahannya relatif kecil.
from __future__ import annotations
from datetime import datetime
from typing_extensions import Annotated
from pydantic import BaseModel
from pydantic.experimental.pipeline import validate_as, validate_as_deferred
class User(BaseModel):
name: Annotated[str, validate_as(str).str_lower()] # (1)!
age: Annotated[int, validate_as(int).gt(0)] # (2)!
username: Annotated[str, validate_as(str).str_pattern(r'[a-z]+')] # (3)!
password: Annotated[
str,
validate_as(str)
.transform(str.lower)
.predicate(lambda x: x != 'password'), # (4)!
]
favorite_number: Annotated[ # (5)!
int,
(validate_as(int) | validate_as(str).str_strip().validate_as(int)).gt(
0
),
]
friends: Annotated[list[User], validate_as(...).len(0, 100)] # (6)!
family: Annotated[ # (7)!
list[User],
validate_as_deferred(lambda: list[User]).transform(lambda x: x[1:]),
]
bio: Annotated[
datetime,
validate_as(int)
.transform(lambda x: x / 1_000_000)
.validate_as(...), # (8)!
]
- Huruf kecil sebuah string.
- Batasi bilangan bulat agar lebih besar dari nol.
- Batasi string agar cocok dengan pola regex.
- Anda juga dapat menggunakan metode transformasi, batasan, dan predikat tingkat rendah.
- Gunakan
|
atau&
operator untuk menggabungkan langkah-langkah (seperti logika OR atau AND). - Memanggil
validate_as(...)
denganEllipsis
,...
sebagai argumen posisi pertama menyiratkanvalidate_as(<field type>)
. Gunakanvalidate_as(Any)
untuk menerima jenis apa pun. - Untuk tipe rekursif, Anda dapat menggunakan
validate_as_deferred
untuk mereferensikan tipe itu sendiri sebelum ditentukan. - Anda dapat memanggil
validate_as()
sebelum atau sesudah langkah lain untuk melakukan pemrosesan sebelum atau sesudah.
Pemetaan dari BeforeValidator
, AfterValidator
dan WrapValidator
¶
Metode validate_as
adalah cara yang lebih aman untuk mendefinisikan BeforeValidator
, AfterValidator
dan WrapValidator
:
from typing_extensions import Annotated
from pydantic.experimental.pipeline import transform, validate_as
# BeforeValidator
Annotated[int, validate_as(str).str_strip().validate_as(...)] # (1)!
# AfterValidator
Annotated[int, transform(lambda x: x * 2)] # (2)!
# WrapValidator
Annotated[
int,
validate_as(str)
.str_strip()
.validate_as(...)
.transform(lambda x: x * 2), # (3)!
]
- Hapus spasi dari string sebelum menguraikannya sebagai bilangan bulat.
- Kalikan bilangan bulat dengan 2 setelah menguraikannya.
- Hapus spasi dari string, validasi sebagai bilangan bulat, lalu kalikan dengan 2.
Pola alternatif¶
Ada banyak pola alternatif untuk digunakan tergantung pada skenario. Sebagai contoh, perhatikan pola UserIn
dan UserOut
yang disebutkan di atas:
from __future__ import annotations
from pydantic import BaseModel
class UserIn(BaseModel):
favorite_number: int | str
class UserOut(BaseModel):
favorite_number: int
def my_api(user: UserIn) -> UserOut:
favorite_number = user.favorite_number
if isinstance(favorite_number, str):
favorite_number = int(user.favorite_number.strip())
return UserOut(favorite_number=favorite_number)
assert my_api(UserIn(favorite_number=' 1 ')).favorite_number == 1
Contoh ini menggunakan kode Python idiomatik biasa yang mungkin lebih mudah dipahami, diperiksa jenisnya, dll. dibandingkan contoh di atas. Pendekatan yang Anda pilih harus benar-benar bergantung pada kasus penggunaan Anda. Anda harus membandingkan verbositas, kinerja, kemudahan mengembalikan kesalahan yang berarti kepada pengguna Anda, dll. untuk memilih pola yang tepat. Berhati-hatilah dalam menyalahgunakan pola lanjutan seperti API pipeline hanya karena Anda bisa.
本文总阅读量次