Traffine I/O

Bahasa Indonesia

2023-03-13

Bendera each_item pada Pydantic Validator

Bendera each_item pada Validator Pydantic

Bendera each_item adalah fitur pada validator Pydantic yang, jika diatur sebagai True, memungkinkan validator untuk menerapkan aturan validasi yang telah ditentukan pada setiap item dalam iterable (seperti list, dictionary) pada data masukan.

Implementasi bendera each_item

Untuk menggunakan bendera each_item, impor decorator validator dari pustaka Pydantic, definisikan fungsi validasi, dan set each_item=True. Fungsi validasi harus menerima nama field, nilai field, dan nilai dari instance model, dan mengembalikan nilai yang telah divalidasi atau menimbulkan error validasi jika masukan tidak memenuhi kriteria yang telah ditentukan.

Berikut adalah contoh implementasinya:

python
from pydantic import BaseModel, validator

class PositiveNumberList(BaseModel):
    numbers: List[int]

    @validator('numbers', each_item=True)
    def validate_positive(cls, item):
        if item < 0:
            raise ValueError('Item must be a positive integer')
        return item

Pada contoh ini, kita telah menentukan model PositiveNumberList dengan field numbers yang mengharapkan sebuah list berisi bilangan bulat. Kita juga telah membuat validator untuk field numbers yang memeriksa setiap item untuk memastikan bahwa itu adalah bilangan bulat positif. Dengan mengatur each_item=True, validator akan menerapkan fungsi validate_positive pada setiap item dalam list.

Kesalahan Umum dan Solusinya

Ketika menggunakan bendera each_item, sangat penting untuk diingat bahwa validator akan diterapkan pada setiap item dalam iterable. Salah satu kesalahan umum adalah menerapkan logika validasi pada iterable secara keseluruhan daripada pada setiap item. Untuk menghindari hal ini, pastikan bahwa logika validasi dalam fungsi dirancang untuk beroperasi pada setiap item.

Misalnya, pertimbangkan implementasi yang salah berikut ini:

python
from pydantic import BaseModel, validator

class IncorrectPositiveNumberList(BaseModel):
    numbers: List[int]

    @validator('numbers', each_item=True)
    def validate_positive(cls, numbers):
        for number in numbers:
            if number < 0:
                raise ValueError('All items must be positive integers')
        return numbers

Dalam kasus ini, fungsi validator validate_positive salah looping melalui iterable numbers dalam fungsi, sementara bendera each_item=True sudah menerapkan fungsi pada setiap item. Hal ini akan menghasilkan TypeError karena fungsi mengharapkan integer tetapi menerima sebuah list.

Untuk memperbaikinya, ubah fungsi untuk beroperasi pada setiap item:

python
from pydantic import BaseModel, validator

class CorrectPositiveNumberList(BaseModel):
    numbers: List[int]

    @validator('numbers', each_item=True)
    def validate_positive(cls, number):
        if number < 0:
            raise ValueError('Item must be a positive integer')
        return number

Sekarang, fungsi validate_positive benar-benar beroperasi pada setiap item dalam list numbers, memastikan bahwa setiap bilangan adalah bilangan bulat positif.

Referensi

https://docs.pydantic.dev/usage/validators/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!