Lewati ke isi

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)!
    ]
  1. Huruf kecil sebuah string.
  2. Batasi bilangan bulat agar lebih besar dari nol.
  3. Batasi string agar cocok dengan pola regex.
  4. Anda juga dapat menggunakan metode transformasi, batasan, dan predikat tingkat rendah.
  5. Gunakan | atau & operator untuk menggabungkan langkah-langkah (seperti logika OR atau AND).
  6. Memanggil validate_as(...) dengan Ellipsis , ... sebagai argumen posisi pertama menyiratkan validate_as(<field type>) . Gunakan validate_as(Any) untuk menerima jenis apa pun.
  7. Untuk tipe rekursif, Anda dapat menggunakan validate_as_deferred untuk mereferensikan tipe itu sendiri sebelum ditentukan.
  8. 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)!
]
  1. Hapus spasi dari string sebelum menguraikannya sebagai bilangan bulat.
  2. Kalikan bilangan bulat dengan 2 setelah menguraikannya.
  3. 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.


本文总阅读量