Lewati ke isi

Kesalahan Penggunaan

Pydantic mencoba memberikan kesalahan yang berguna. Bagian berikut memberikan detail tentang kesalahan umum yang mungkin ditemui pengembang saat bekerja dengan Pydantic, bersama dengan saran untuk mengatasi kondisi kesalahan tersebut.

Kelas tidak sepenuhnya ditentukan

Kesalahan ini muncul ketika tipe yang direferensikan dalam anotasi tipe yang divalidasi pydantic (seperti subkelas BaseModel , atau dataclass pydantic ) tidak ditentukan:

from typing import ForwardRef

from pydantic import BaseModel, PydanticUserError

UndefinedType = ForwardRef('UndefinedType')


class Foobar(BaseModel):
    a: UndefinedType


try:
    Foobar(a=1)
except PydanticUserError as exc_info:
    assert exc_info.code == 'class-not-fully-defined'

Atau ketika tipe telah ditentukan setelah penggunaan:

from typing import Optional

from pydantic import BaseModel, PydanticUserError


class Foo(BaseModel):
    a: Optional['Bar'] = None


try:
    # this doesn't work, see raised error
    foo = Foo(a={'b': {'a': None}})
except PydanticUserError as exc_info:
    assert exc_info.code == 'class-not-fully-defined'


class Bar(BaseModel):
    b: 'Foo'


# this works, though
foo = Foo(a={'b': {'a': None}})

Untuk subkelas BaseModel, hal ini dapat diperbaiki dengan menentukan tipenya dan kemudian memanggil .model_rebuild() :

from typing import Optional

from pydantic import BaseModel


class Foo(BaseModel):
    a: Optional['Bar'] = None


class Bar(BaseModel):
    b: 'Foo'


Foo.model_rebuild()

foo = Foo(a={'b': {'a': None}})

Dalam kasus lain, pesan kesalahan harus menunjukkan cara membangun kembali kelas dengan tipe yang sesuai yang ditentukan.

Skema JSON Khusus

Metode __modify_schema__ tidak lagi didukung di V2. Anda harus menggunakan metode __get_pydantic_json_schema__ sebagai gantinya.

__modify_schema__ digunakan untuk menerima argumen tunggal yang mewakili skema JSON. Lihat contoh di bawah ini:

from pydantic import BaseModel, PydanticUserError

try:

    class Model(BaseModel):
        @classmethod
        def __modify_schema__(cls, field_schema):
            field_schema.update(examples='examples')

except PydanticUserError as exc_info:
    assert exc_info.code == 'custom-json-schema'

Metode baru __get_pydantic_json_schema__ menerima dua argumen: yang pertama adalah kamus yang dilambangkan sebagai CoreSchema , dan yang kedua adalah handler callable yang menerima CoreSchema sebagai parameter, dan mengembalikan skema JSON. Lihat contoh di bawah ini:

from typing import Any, Dict

from pydantic_core import CoreSchema

from pydantic import BaseModel, GetJsonSchemaHandler


class Model(BaseModel):
    @classmethod
    def __get_pydantic_json_schema__(
        cls, core_schema: CoreSchema, handler: GetJsonSchemaHandler
    ) -> Dict[str, Any]:
        json_schema = super().__get_pydantic_json_schema__(core_schema, handler)
        json_schema = handler.resolve_ref_schema(json_schema)
        json_schema.update(examples='examples')
        return json_schema


print(Model.model_json_schema())
"""
{'examples': 'examples', 'properties': {}, 'title': 'Model', 'type': 'object'}
"""

Dekorator pada bidang yang hilang

Kesalahan ini muncul ketika Anda mendefinisikan dekorator dengan bidang yang tidak valid.

from typing import Any

from pydantic import BaseModel, PydanticUserError, field_validator

try:

    class Model(BaseModel):
        a: str

        @field_validator('b')
        def check_b(cls, v: Any):
            return v

except PydanticUserError as exc_info:
    assert exc_info.code == 'decorator-missing-field'

Anda dapat menggunakan check_fields=False jika Anda mewarisi model dan menginginkannya.

from typing import Any

from pydantic import BaseModel, create_model, field_validator


class Model(BaseModel):
    @field_validator('a', check_fields=False)
    def check_a(cls, v: Any):
        return v


model = create_model('FooModel', a=(str, 'cake'), __base__=Model)

Diskriminator tanpa kolom

Kesalahan ini muncul ketika model dalam serikat pekerja yang didiskriminasi tidak menentukan bidang diskriminator.

from typing import Union

from typing_extensions import Literal

from pydantic import BaseModel, Field, PydanticUserError


class Cat(BaseModel):
    c: str


class Dog(BaseModel):
    pet_type: Literal['dog']
    d: str


try:

    class Model(BaseModel):
        pet: Union[Cat, Dog] = Field(..., discriminator='pet_type')
        number: int

except PydanticUserError as exc_info:
    assert exc_info.code == 'discriminator-no-field'

Tipe alias diskriminator

Kesalahan ini muncul ketika Anda mendefinisikan alias non-string pada bidang diskriminator.

from typing import Union

from typing_extensions import Literal

from pydantic import AliasChoices, BaseModel, Field, PydanticUserError


class Cat(BaseModel):
    pet_type: Literal['cat'] = Field(
        validation_alias=AliasChoices('Pet', 'PET')
    )
    c: str


class Dog(BaseModel):
    pet_type: Literal['dog']
    d: str


try:

    class Model(BaseModel):
        pet: Union[Cat, Dog] = Field(..., discriminator='pet_type')
        number: int

except PydanticUserError as exc_info:
    assert exc_info.code == 'discriminator-alias-type'

Diskriminator membutuhkan {#discriminator-needs-literal} secara literal

Kesalahan ini muncul ketika Anda mendefinisikan tipe non- Literal pada bidang diskriminator.

from typing import Union

from typing_extensions import Literal

from pydantic import BaseModel, Field, PydanticUserError


class Cat(BaseModel):
    pet_type: int
    c: str


class Dog(BaseModel):
    pet_type: Literal['dog']
    d: str


try:

    class Model(BaseModel):
        pet: Union[Cat, Dog] = Field(..., discriminator='pet_type')
        number: int

except PydanticUserError as exc_info:
    assert exc_info.code == 'discriminator-needs-literal'

Alias diskriminator

Kesalahan ini muncul ketika Anda mendefinisikan alias berbeda pada bidang diskriminator.

from typing import Union

from typing_extensions import Literal

from pydantic import BaseModel, Field, PydanticUserError


class Cat(BaseModel):
    pet_type: Literal['cat'] = Field(validation_alias='PET')
    c: str


class Dog(BaseModel):
    pet_type: Literal['dog'] = Field(validation_alias='Pet')
    d: str


try:

    class Model(BaseModel):
        pet: Union[Cat, Dog] = Field(..., discriminator='pet_type')
        number: int

except PydanticUserError as exc_info:
    assert exc_info.code == 'discriminator-alias'

Validator diskriminator tidak valid

Kesalahan ini muncul ketika Anda menggunakan validator sebelumnya, bungkus, atau biasa pada bidang diskriminator.

Hal ini tidak diperbolehkan karena bidang diskriminator digunakan untuk menentukan jenis model yang akan digunakan untuk validasi, sehingga Anda tidak dapat menggunakan validator yang mungkin mengubah nilainya.

from typing import Union

from typing_extensions import Literal

from pydantic import BaseModel, Field, PydanticUserError, field_validator


class Cat(BaseModel):
    pet_type: Literal['cat']

    @field_validator('pet_type', mode='before')
    @classmethod
    def validate_pet_type(cls, v):
        if v == 'kitten':
            return 'cat'
        return v


class Dog(BaseModel):
    pet_type: Literal['dog']


try:

    class Model(BaseModel):
        pet: Union[Cat, Dog] = Field(..., discriminator='pet_type')
        number: int

except PydanticUserError as exc_info:
    assert exc_info.code == 'discriminator-validator'

Hal ini dapat diatasi dengan menggunakan Union standar, menghilangkan diskriminator:

from typing import Union

from typing_extensions import Literal

from pydantic import BaseModel, field_validator


class Cat(BaseModel):
    pet_type: Literal['cat']

    @field_validator('pet_type', mode='before')
    @classmethod
    def validate_pet_type(cls, v):
        if v == 'kitten':
            return 'cat'
        return v


class Dog(BaseModel):
    pet_type: Literal['dog']


class Model(BaseModel):
    pet: Union[Cat, Dog]


assert Model(pet={'pet_type': 'kitten'}).pet.pet_type == 'cat'

Kasus diskriminator yang dapat dipanggil tanpa tag

Kesalahan ini muncul ketika Union yang menggunakan Discriminator yang dapat dipanggil tidak memiliki anotasi Tag untuk semua kasus.

from typing import Union

from typing_extensions import Annotated

from pydantic import BaseModel, Discriminator, PydanticUserError, Tag


def model_x_discriminator(v):
    if isinstance(v, str):
        return 'str'
    if isinstance(v, (dict, BaseModel)):
        return 'model'


# tag missing for both union choices
try:

    class DiscriminatedModel(BaseModel):
        x: Annotated[
            Union[str, 'DiscriminatedModel'],
            Discriminator(model_x_discriminator),
        ]

except PydanticUserError as exc_info:
    assert exc_info.code == 'callable-discriminator-no-tag'

# tag missing for `'DiscriminatedModel'` union choice
try:

    class DiscriminatedModel(BaseModel):
        x: Annotated[
            Union[Annotated[str, Tag('str')], 'DiscriminatedModel'],
            Discriminator(model_x_discriminator),
        ]

except PydanticUserError as exc_info:
    assert exc_info.code == 'callable-discriminator-no-tag'

# tag missing for `str` union choice
try:

    class DiscriminatedModel(BaseModel):
        x: Annotated[
            Union[str, Annotated['DiscriminatedModel', Tag('model')]],
            Discriminator(model_x_discriminator),
        ]

except PydanticUserError as exc_info:
    assert exc_info.code == 'callable-discriminator-no-tag'

Versi TypedDict

Kesalahan ini muncul saat Anda menggunakan typing.TypedDict alih-alih typing_extensions.TypedDict pada Python <3.12.

Bidang induk model diganti

Kesalahan ini muncul ketika bidang yang ditentukan pada kelas dasar ditimpa oleh atribut yang tidak diberi anotasi.

from pydantic import BaseModel, PydanticUserError


class Foo(BaseModel):
    a: float


try:

    class Bar(Foo):
        x: float = 12.3
        a = 123.0

except PydanticUserError as exc_info:
    assert exc_info.code == 'model-field-overridden'

Bidang model tidak memiliki anotasi

Kesalahan ini muncul ketika suatu bidang tidak memiliki anotasi.

from pydantic import BaseModel, Field, PydanticUserError

try:

    class Model(BaseModel):
        a = Field('foobar')
        b = None

except PydanticUserError as exc_info:
    assert exc_info.code == 'model-field-missing-annotation'

Jika bidang tersebut tidak dimaksudkan sebagai bidang, Anda mungkin dapat mengatasi kesalahan tersebut dengan menganotasinya sebagai ClassVar :

from typing import ClassVar

from pydantic import BaseModel


class Model(BaseModel):
    a: ClassVar[str]

Atau memperbarui model_config['ignored_types'] :

from pydantic import BaseModel, ConfigDict


class IgnoredType:
    pass


class MyModel(BaseModel):
    model_config = ConfigDict(ignored_types=(IgnoredType,))

    _a = IgnoredType()
    _b: int = IgnoredType()
    _c: IgnoredType
    _d: IgnoredType = IgnoredType()

Config dan model_config keduanya ditentukan

Kesalahan ini muncul ketika class Config dan model_config digunakan bersama.

from pydantic import BaseModel, ConfigDict, PydanticUserError

try:

    class Model(BaseModel):
        model_config = ConfigDict(from_attributes=True)

        a: str

        class Config:
            from_attributes = True

except PydanticUserError as exc_info:
    assert exc_info.code == 'config-both'

Argumen kata kunci dihapus

Kesalahan ini muncul ketika argumen kata kunci tidak tersedia di Pydantic V2.

Misalnya, regex dihapus dari Pydantic V2:

from pydantic import BaseModel, Field, PydanticUserError

try:

    class Model(BaseModel):
        x: str = Field(regex='test')

except PydanticUserError as exc_info:
    assert exc_info.code == 'removed-kwargs'

Skema JSON tipe tidak valid

Kesalahan ini muncul ketika Pydantic gagal menghasilkan skema JSON untuk beberapa CoreSchema .

from pydantic import BaseModel, ImportString, PydanticUserError


class Model(BaseModel):
    a: ImportString


try:
    Model.model_json_schema()
except PydanticUserError as exc_info:
    assert exc_info.code == 'invalid-for-json-schema'

Skema JSON sudah digunakan

Kesalahan ini muncul ketika generator skema JSON telah digunakan untuk menghasilkan skema JSON. Anda harus membuat instance baru untuk menghasilkan skema JSON baru.

BaseModel dibuat

Kesalahan ini muncul saat Anda membuat instance BaseModel secara langsung. Model Pydantic harus mewarisi dari BaseModel .

from pydantic import BaseModel, PydanticUserError

try:
    BaseModel()
except PydanticUserError as exc_info:
    assert exc_info.code == 'base-model-instantiated'

Anotasi tidak terdefinisi

Kesalahan ini muncul saat menangani anotasi yang tidak ditentukan selama pembuatan CoreSchema .

from pydantic import BaseModel, PydanticUndefinedAnnotation


class Model(BaseModel):
    a: 'B'  # noqa F821


try:
    Model.model_rebuild()
except PydanticUndefinedAnnotation as exc_info:
    assert exc_info.code == 'undefined-annotation'

Skema untuk tipe yang tidak diketahui

Kesalahan ini muncul ketika Pydantic gagal menghasilkan CoreSchema untuk beberapa jenis.

from pydantic import BaseModel, PydanticUserError

try:

    class Model(BaseModel):
        x: 43 = 123

except PydanticUserError as exc_info:
    assert exc_info.code == 'schema-for-unknown-type'

Kesalahan impor

Kesalahan ini muncul ketika Anda mencoba mengimpor objek yang tersedia di Pydantic V1, tetapi telah dihapus di Pydantic V2.

Lihat Panduan Migrasi untuk informasi lebih lanjut.

create_model definisi bidang

Kesalahan ini muncul ketika Anda memberikan input definisi bidang di create_model yang tidak valid.

from pydantic import PydanticUserError, create_model

try:
    create_model('FooModel', foo=(str, 'default value', 'more'))
except PydanticUserError as exc_info:
    assert exc_info.code == 'create-model-field-definitions'

Atau saat Anda menggunakan typing.Annotated dengan input yang tidak valid

from typing_extensions import Annotated

from pydantic import PydanticUserError, create_model

try:
    create_model('FooModel', foo=Annotated[str, 'NotFieldInfoValue'])
except PydanticUserError as exc_info:
    assert exc_info.code == 'create-model-field-definitions'

create_model basis konfigurasi

Kesalahan ini muncul saat Anda menggunakan __config__ dan __base__ secara bersamaan di create_model .

from pydantic import BaseModel, ConfigDict, PydanticUserError, create_model

try:
    config = ConfigDict(frozen=True)
    model = create_model(
        'FooModel', foo=(int, ...), __config__=config, __base__=BaseModel
    )
except PydanticUserError as exc_info:
    assert exc_info.code == 'create-model-config-base'

Validator tanpa kolom

Kesalahan ini muncul ketika Anda menggunakan validator kosong (tanpa bidang).

from pydantic import BaseModel, PydanticUserError, field_validator

try:

    class Model(BaseModel):
        a: str

        @field_validator
        def checker(cls, v):
            return v

except PydanticUserError as exc_info:
    assert exc_info.code == 'validator-no-fields'

Validator harus digunakan dengan argumen bidang dan kata kunci.

from pydantic import BaseModel, field_validator


class Model(BaseModel):
    a: str

    @field_validator('a')
    def checker(cls, v):
        return v

Bidang validator tidak valid

Kesalahan ini muncul ketika Anda menggunakan validator dengan bidang non-string.

from pydantic import BaseModel, PydanticUserError, field_validator

try:

    class Model(BaseModel):
        a: str
        b: str

        @field_validator(['a', 'b'])
        def check_fields(cls, v):
            return v

except PydanticUserError as exc_info:
    assert exc_info.code == 'validator-invalid-fields'

Bidang harus diteruskan sebagai argumen string terpisah:

from pydantic import BaseModel, field_validator


class Model(BaseModel):
    a: str
    b: str

    @field_validator('a', 'b')
    def check_fields(cls, v):
        return v

Validator pada metode instance

Kesalahan ini muncul ketika Anda menerapkan validator pada metode instans.

from pydantic import BaseModel, PydanticUserError, field_validator

try:

    class Model(BaseModel):
        a: int = 1

        @field_validator('a')
        def check_a(self, values):
            return values

except PydanticUserError as exc_info:
    assert exc_info.code == 'validator-instance-method'

Validator root, pre , skip_on_failure

Jika Anda menggunakan @root_validator dengan pre=False (default), Anda HARUS menentukan skip_on_failure=True . Opsi skip_on_failure=False tidak lagi tersedia.

Jika Anda tidak mencoba menyetel skip_on_failure=False , Anda dapat menyetel skip_on_failure=True dengan aman. Jika Anda melakukannya, validator root ini tidak akan dipanggil lagi jika validasi gagal untuk salah satu bidang.

Silakan lihat Panduan Migrasi untuk lebih jelasnya.

metode instance model_serializer

@model_serializer harus diterapkan pada metode instan.

Kesalahan ini muncul ketika Anda menerapkan model_serializer pada metode instance tanpa self :

from pydantic import BaseModel, PydanticUserError, model_serializer

try:

    class MyModel(BaseModel):
        a: int

        @model_serializer
        def _serialize(slf, x, y, z):
            return slf

except PydanticUserError as exc_info:
    assert exc_info.code == 'model-serializer-instance-method'

Atau pada metode kelas:

from pydantic import BaseModel, PydanticUserError, model_serializer

try:

    class MyModel(BaseModel):
        a: int

        @model_serializer
        @classmethod
        def _serialize(self, x, y, z):
            return self

except PydanticUserError as exc_info:
    assert exc_info.code == 'model-serializer-instance-method'

validator , field , config , dan info

Parameter field dan config tidak tersedia di Pydantic V2. Silakan gunakan parameter info sebagai gantinya.

Anda dapat mengakses konfigurasi melalui info.config , tetapi ini adalah kamus, bukan objek seperti di Pydantic V1.

Argumen field tidak lagi tersedia.

Tanda tangan validator Pydantic V1

Kesalahan ini muncul ketika Anda menggunakan tanda tangan yang tidak didukung untuk validator gaya Pydantic V1.

import warnings

from pydantic import BaseModel, PydanticUserError, validator

warnings.filterwarnings('ignore', category=DeprecationWarning)

try:

    class Model(BaseModel):
        a: int

        @validator('a')
        def check_a(cls, value, foo):
            return value

except PydanticUserError as exc_info:
    assert exc_info.code == 'validator-v1-signature'

field_validator tanda tangan tidak dikenal

Kesalahan ini muncul ketika fungsi field_validator atau model_validator memiliki tanda tangan yang salah.

from pydantic import BaseModel, PydanticUserError, field_validator

try:

    class Model(BaseModel):
        a: str

        @field_validator('a')
        @classmethod
        def check_a(cls):
            return 'a'

except PydanticUserError as exc_info:
    assert exc_info.code == 'validator-signature'

Tanda tangan field_serializer tidak dikenal

Kesalahan ini muncul ketika fungsi field_serializer memiliki tanda tangan yang salah.

from pydantic import BaseModel, PydanticUserError, field_serializer

try:

    class Model(BaseModel):
        x: int

        @field_serializer('x')
        def no_args():
            return 'x'

except PydanticUserError as exc_info:
    assert exc_info.code == 'field-serializer-signature'

Tanda tangan serializer yang valid adalah:

from pydantic import model_serializer

# an instance method with the default mode or `mode='plain'`
@model_serializer('x')  # or @serialize('x', mode='plain')
def ser_x(self, value: Any, info: pydantic.FieldSerializationInfo): ...

# a static method or free-standing function with the default mode or `mode='plain'`
@model_serializer('x')  # or @serialize('x', mode='plain')
@staticmethod
def ser_x(value: Any, info: pydantic.FieldSerializationInfo): ...
# equivalent to
def ser_x(value: Any, info: pydantic.FieldSerializationInfo): ...
serializer('x')(ser_x)

# an instance method with `mode='wrap'`
@model_serializer('x', mode='wrap')
def ser_x(self, value: Any, nxt: pydantic.SerializerFunctionWrapHandler, info: pydantic.FieldSerializationInfo): ...

# a static method or free-standing function with `mode='wrap'`
@model_serializer('x', mode='wrap')
@staticmethod
def ser_x(value: Any, nxt: pydantic.SerializerFunctionWrapHandler, info: pydantic.FieldSerializationInfo): ...
# equivalent to
def ser_x(value: Any, nxt: pydantic.SerializerFunctionWrapHandler, info: pydantic.FieldSerializationInfo): ...
serializer('x')(ser_x)

For all of these, you can also choose to omit the `info` argument, for example:

@model_serializer('x')
def ser_x(self, value: Any): ...

@model_serializer('x', mode='wrap')
def ser_x(self, value: Any, handler: pydantic.SerializerFunctionWrapHandler): ...

Tanda tangan model_serializer tidak dikenal

Kesalahan ini muncul ketika fungsi model_serializer memiliki tanda tangan yang salah.

from pydantic import BaseModel, PydanticUserError, model_serializer

try:

    class MyModel(BaseModel):
        a: int

        @model_serializer
        def _serialize(self, x, y, z):
            return self

except PydanticUserError as exc_info:
    assert exc_info.code == 'model-serializer-signature'

Serializer beberapa bidang

Kesalahan ini muncul ketika beberapa fungsi model_serializer ditentukan untuk suatu bidang.

from pydantic import BaseModel, PydanticUserError, field_serializer

try:

    class MyModel(BaseModel):
        x: int
        y: int

        @field_serializer('x', 'y')
        def serializer1(v):
            return f'{v:,}'

        @field_serializer('x')
        def serializer2(v):
            return v

except PydanticUserError as exc_info:
    assert exc_info.code == 'multiple-field-serializers'

Jenis beranotasi tidak valid

Kesalahan ini muncul ketika anotasi tidak dapat memberi anotasi pada suatu tipe.

from typing_extensions import Annotated

from pydantic import BaseModel, FutureDate, PydanticUserError

try:

    class Model(BaseModel):
        foo: Annotated[str, FutureDate()]

except PydanticUserError as exc_info:
    assert exc_info.code == 'invalid-annotated-type'

config tidak digunakan dengan TypeAdapter

Anda akan mendapatkan kesalahan ini jika Anda mencoba meneruskan config ke TypeAdapter ketika tipenya adalah tipe yang memiliki konfigurasinya sendiri yang tidak dapat diganti (saat ini hanya BaseModel , TypedDict dan dataclass ):

from typing_extensions import TypedDict

from pydantic import ConfigDict, PydanticUserError, TypeAdapter


class MyTypedDict(TypedDict):
    x: int


try:
    TypeAdapter(MyTypedDict, config=ConfigDict(strict=True))
except PydanticUserError as exc_info:
    assert exc_info.code == 'type-adapter-config-unused'

Sebagai gantinya, Anda harus membuat subkelas tipenya dan mengganti atau mengatur konfigurasinya:

from typing_extensions import TypedDict

from pydantic import ConfigDict, TypeAdapter


class MyTypedDict(TypedDict):
    x: int

    # or `model_config = ...` for BaseModel
    __pydantic_config__ = ConfigDict(strict=True)


TypeAdapter(MyTypedDict)  # ok

Tidak dapat menentukan model_config['extra'] dengan RootModel

Karena RootModel tidak mampu menyimpan atau bahkan menerima kolom tambahan selama inisialisasi, kami memunculkan kesalahan jika Anda mencoba menentukan nilai untuk pengaturan konfigurasi 'extra' saat membuat subkelas RootModel :

from pydantic import PydanticUserError, RootModel

try:

    class MyRootModel(RootModel):
        model_config = {'extra': 'allow'}
        root: int

except PydanticUserError as exc_info:
    assert exc_info.code == 'root-model-extra'

Tidak dapat mengevaluasi anotasi tipe

Karena anotasi tipe dievaluasi setelah penugasan, Anda mungkin mendapatkan hasil yang tidak diharapkan saat menggunakan nama anotasi tipe yang bentrok dengan salah satu bidang Anda. Kami memunculkan kesalahan dalam kasus berikut:

from datetime import date

from pydantic import BaseModel, Field


class Model(BaseModel):
    date: date = Field(description='A date')

Sebagai solusinya, Anda dapat menggunakan alias atau mengubah impor Anda:

import datetime
# Or `from datetime import date as _date`

from pydantic import BaseModel, Field


class Model(BaseModel):
    date: datetime.date = Field(description='A date')

Pengaturan init dan extra dataclass tidak kompatibel

Pydantic tidak mengizinkan spesifikasi pengaturan extra='allow' pada kelas data sementara salah satu bidang memiliki set init=False .

Oleh karena itu, Anda tidak boleh melakukan hal seperti berikut:

from pydantic import ConfigDict, Field
from pydantic.dataclasses import dataclass


@dataclass(config=ConfigDict(extra='allow'))
class A:
    a: int = Field(init=False, default=1)

Cuplikan di atas menghasilkan kesalahan berikut selama pembuatan skema untuk kelas data A :

pydantic.errors.PydanticUserError: Field a has `init=False` and dataclass has config setting `extra="allow"`.
This combination is not allowed.

Setelan init dan init_var tidak kompatibel pada kolom dataclass

Pengaturan init=False dan init_var=True saling eksklusif. Melakukannya akan menghasilkan PydanticUserError yang ditunjukkan pada contoh di bawah.

from pydantic import Field
from pydantic.dataclasses import dataclass


@dataclass
class Foo:
    bar: str = Field(..., init=False, init_var=True)


"""
pydantic.errors.PydanticUserError: Dataclass field bar has init=False and init_var=True, but these are mutually exclusive.
"""

model_config digunakan sebagai bidang model

Kesalahan ini muncul ketika model_config digunakan sebagai nama bidang.

from pydantic import BaseModel, PydanticUserError

try:

    class Model(BaseModel):
        model_config: str

except PydanticUserError as exc_info:
    assert exc_info.code == 'model-config-invalid-field-name'

with_config digunakan pada subkelas BaseModel

Kesalahan ini muncul ketika dekorator with_config digunakan pada kelas yang sudah menjadi model Pydantic (gunakan atribut model_config sebagai gantinya).

from pydantic import BaseModel, PydanticUserError, with_config

try:

    @with_config({'allow_inf_nan': True})
    class Model(BaseModel):
        bar: str

except PydanticUserError as exc_info:
    assert exc_info.code == 'with-config-on-model'

dataclass digunakan pada subkelas BaseModel

Kesalahan ini muncul ketika dekorator dataclass Pydantic digunakan pada kelas yang sudah menjadi model Pydantic.

from pydantic import BaseModel, PydanticUserError
from pydantic.dataclasses import dataclass

try:

    @dataclass
    class Model(BaseModel):
        bar: str

except PydanticUserError as exc_info:
    assert exc_info.code == 'dataclass-on-model'

本文总阅读量