Zum Inhalt

Anwendungsfehler

Pydantic versucht, nützliche Fehler bereitzustellen. Die folgenden Abschnitte enthalten Details zu häufigen Fehlern, auf die Entwickler bei der Arbeit mit Pydantic stoßen können, sowie Vorschläge zur Behebung der Fehlerbedingung.

Klasse nicht vollständig definiert

Dieser Fehler wird ausgelöst, wenn ein Typ, auf den in einer Annotation eines pydantic-validierten Typs verwiesen wird (z. B. eine Unterklasse von BaseModel oder eine pydantic- dataclass ), nicht definiert ist:

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'

Oder wenn der Typ nach der Verwendung definiert wurde:

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}})

Bei BaseModel-Unterklassen kann dies behoben werden, indem der Typ definiert und dann .model_rebuild() aufgerufen wird:

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}})

In anderen Fällen sollte die Fehlermeldung angeben, wie die Klasse mit dem entsprechenden definierten Typ neu erstellt werden kann.

Benutzerdefiniertes JSON-Schema

Die Methode __modify_schema__ wird in V2 nicht mehr unterstützt. Sie sollten stattdessen die Methode __get_pydantic_json_schema__ verwenden.

Das __modify_schema__ wird verwendet, um ein einzelnes Argument zu empfangen, das das JSON-Schema darstellt. Siehe das Beispiel unten:

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'

Die neue Methode __get_pydantic_json_schema__ empfängt zwei Argumente: Das erste ist ein Wörterbuch mit der Bezeichnung CoreSchema und das zweite ein aufrufbarer handler , der ein CoreSchema als Parameter empfängt und ein JSON-Schema zurückgibt. Siehe das Beispiel unten:

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'}
"""

Dekorateur auf fehlendem Feld

Dieser Fehler wird ausgelöst, wenn Sie einen Dekorator mit einem ungültigen Feld definieren.

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'

Sie können check_fields=False verwenden, wenn Sie vom Modell erben und dies beabsichtigen.

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 kein Feld

Dieser Fehler wird ausgelöst, wenn ein Modell in diskriminierten Gewerkschaften kein Diskriminatorfeld definiert.

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'

Diskriminator-Aliastyp

Dieser Fehler wird ausgelöst, wenn Sie einen Nicht-String-Alias für ein Diskriminatorfeld definieren.

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 braucht Literal

Dieser Fehler wird ausgelöst, wenn Sie einen Nicht Literal -Typ für ein Diskriminatorfeld definieren.

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'

Diskriminator-Alias

Dieser Fehler wird ausgelöst, wenn Sie unterschiedliche Aliase für Diskriminatorfelder definieren.

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'

Ungültiger Diskriminator-Validator

Dieser Fehler wird ausgelöst, wenn Sie einen Before-, Wrap- oder Plain-Validator für ein Diskriminatorfeld verwenden.

Dies ist nicht zulässig, da das Diskriminatorfeld verwendet wird, um den Typ des für die Validierung zu verwendenden Modells zu bestimmen. Sie können also keinen Validator verwenden, der seinen Wert ändern könnte.

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'

Dies kann umgangen werden, indem ein Standard Union verwendet und der Diskriminator weggelassen wird:

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'

Callable-Diskriminator-Fall ohne Tag

Dieser Fehler wird ausgelöst, wenn eine Union , die einen aufrufbaren Discriminator verwendet, nicht für alle Fälle Tag -Anmerkungen verfügt.

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'

TypedDict version

Dieser Fehler wird ausgelöst, wenn Sie typing.TypedDict anstelle von typing_extensions.TypedDict in Python < 3.12 verwenden.

Das übergeordnete Modellfeld wurde überschrieben

Dieser Fehler wird ausgelöst, wenn ein in einer Basisklasse definiertes Feld durch ein nicht annotiertes Attribut überschrieben wurde.

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'

Annotation zum Modellfeld fehlt

Dieser Fehler wird ausgelöst, wenn ein Feld keine Anmerkung hat.

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'

Wenn das Feld kein Feld sein soll, können Sie den Fehler möglicherweise beheben, indem Sie es als ClassVar annotieren:

from typing import ClassVar

from pydantic import BaseModel


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

Oder model_config['ignored_types'] aktualisieren:

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 und model_config definierten beide

Dieser Fehler wird ausgelöst, wenn class Config und model_config zusammen verwendet werden.

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'

Keyword-Argumente entfernt

Dieser Fehler wird ausgelöst, wenn die Schlüsselwortargumente in Pydantic V2 nicht verfügbar sind.

regex wird beispielsweise aus Pydantic V2 entfernt:

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'

JSON schema invalid type

Dieser Fehler wird ausgelöst, wenn Pydantic für einige CoreSchema kein JSON-Schema generieren kann.

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'

JSON-Schema bereits verwendet

Dieser Fehler wird ausgelöst, wenn der JSON-Schemagenerator bereits zum Generieren eines JSON-Schemas verwendet wurde. Sie müssen eine neue Instanz erstellen, um ein neues JSON-Schema zu generieren.

BaseModel instanziiert

Dieser Fehler wird ausgelöst, wenn Sie BaseModel direkt instanziieren. Pydantic-Modelle sollten von BaseModel erben.

from pydantic import BaseModel, PydanticUserError

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

Undefinierte Anmerkung

Dieser Fehler wird ausgelöst, wenn undefinierte Anmerkungen während CoreSchema Generierung verarbeitet werden.

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'

Schema für unbekannten Typ

Dieser Fehler wird ausgelöst, wenn Pydantic für einen Typ kein CoreSchema generiert.

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'

Importfehler

Dieser Fehler wird ausgelöst, wenn Sie versuchen, ein Objekt zu importieren, das in Pydantic V1 verfügbar war, aber in Pydantic V2 entfernt wurde.

Weitere Informationen finden Sie im Migrationsleitfaden .

create_model Felddefinitionen

Dieser Fehler wird ausgelöst, wenn Sie in create_model eine Felddefinitionseingabe bereitstellen, die ungültig ist.

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'

Oder wenn Sie typing.Annotated mit ungültiger Eingabe verwenden

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 -Konfigurationsbasis

Dieser Fehler wird ausgelöst, wenn Sie sowohl __config__ als auch __base__ zusammen in create_model verwenden.

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 ohne Felder

Dieser Fehler wird ausgelöst, wenn Sie den Validator nackt (ohne Felder) verwenden.

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'

Validatoren sollten mit Feldern und Schlüsselwortargumenten verwendet werden.

from pydantic import BaseModel, field_validator


class Model(BaseModel):
    a: str

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

Ungültige Validatorfelder

Dieser Fehler wird ausgelöst, wenn Sie einen Validator mit Nicht-String-Feldern verwenden.

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'

Felder sollten als separate String-Argumente übergeben werden:

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 für Instanzmethode

Dieser Fehler wird ausgelöst, wenn Sie einen Validator auf eine Instanzmethode anwenden.

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'

Root-Validator, pre , skip_on_failure

Wenn Sie @root_validator mit pre=False (Standardeinstellung) verwenden, MÜSSEN Sie skip_on_failure=True angeben. Die Option skip_on_failure=False ist nicht mehr verfügbar.

Wenn Sie nicht versucht haben skip_on_failure=False festzulegen, können Sie skip_on_failure=True bedenkenlos festlegen. Wenn Sie dies tun, wird dieser Root-Validator nicht mehr aufgerufen, wenn die Validierung für eines der Felder fehlschlägt.

Weitere Informationen finden Sie im Migrationsleitfaden .

model_serializer Instanzmethoden

@model_serializer muss auf Instanzmethoden angewendet werden.

Dieser Fehler wird ausgelöst, wenn Sie model_serializer auf eine Instanzmethode ohne self anwenden:

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'

Oder auf einer Klassenmethode:

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 und info

Die field und config sind in Pydantic V2 nicht verfügbar. Bitte verwenden Sie stattdessen den info -Parameter.

Sie können über info.config auf die Konfiguration zugreifen, es handelt sich jedoch um ein Wörterbuch und nicht um ein Objekt wie in Pydantic V1.

Das field ist nicht mehr verfügbar.

Pydantic V1-Validatorsignatur

Dieser Fehler wird ausgelöst, wenn Sie eine nicht unterstützte Signatur für den Validator im Pydantic V1-Stil verwenden.

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'

Unbekannte field_validator -Signatur

Dieser Fehler wird ausgelöst, wenn eine field_validator oder model_validator -Funktion die falsche Signatur hat.

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'

Unbekannte field_serializer Signatur

Dieser Fehler wird ausgelöst, wenn die Funktion field_serializer die falsche Signatur hat.

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'

Gültige Serialisierungssignaturen sind:

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): ...

Unbekannte model_serializer Signatur

Dieser Fehler wird ausgelöst, wenn die Funktion model_serializer die falsche Signatur hat.

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'

Serialisierer für mehrere Felder

Dieser Fehler wird ausgelöst, wenn mehrere model_serializer -Funktionen für ein Feld definiert sind.

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'

Ungültiger annotierter Typ

Dieser Fehler wird ausgelöst, wenn eine Annotation einen Typ nicht annotieren kann.

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 wird mit TypeAdapter nicht verwendet

Sie erhalten diese Fehlermeldung, wenn Sie versuchen, config an TypeAdapter zu übergeben, wenn es sich bei dem Typ um einen Typ handelt, der über eine eigene Konfiguration verfügt, die nicht überschrieben werden kann (derzeit sind dies nur BaseModel , TypedDict und 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'

Stattdessen müssen Sie den Typ in eine Unterklasse umwandeln und die Konfiguration überschreiben oder festlegen:

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

model_config['extra'] kann nicht mit RootModel {#root-model-extra} angegeben werden

Da RootModel nicht in der Lage ist, zusätzliche Felder während der Initialisierung zu speichern oder gar zu akzeptieren, lösen wir einen Fehler aus, wenn Sie versuchen, beim Erstellen einer Unterklasse von RootModel einen Wert für die Konfigurationseinstellung 'extra' anzugeben:

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'

Typanmerkung kann nicht ausgewertet werden

Da Typanmerkungen nach Zuweisungen ausgewertet werden, erhalten Sie möglicherweise unerwartete Ergebnisse, wenn Sie einen Typanmerkungsnamen verwenden, der mit einem Ihrer Felder kollidiert. Im folgenden Fall melden wir einen Fehler:

from datetime import date

from pydantic import BaseModel, Field


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

Um dieses Problem zu umgehen, können Sie entweder einen Alias verwenden oder Ihren Import ändern:

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

from pydantic import BaseModel, Field


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

init dataclass und extra Einstellungen

Pydantic erlaubt nicht die Angabe der Einstellung extra='allow' für eine Datenklasse, während in einem der Felder init=False gesetzt ist.

Daher dürfen Sie Folgendes nicht tun:

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


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

Das obige Snippet führt während der Schemaerstellung für die A Datenklasse zu folgendem Fehler:

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

Inkompatible init und init_var Einstellungen im dataclass

Die Einstellungen init=False und init_var=True schließen sich gegenseitig aus. Dies führt zu dem im folgenden Beispiel gezeigten PydanticUserError .

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 wird als Modellfeld verwendet

Dieser Fehler wird ausgelöst, wenn model_config als Name eines Feldes verwendet wird.

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 wird auf einer BaseModel Unterklasse {#with-config-on-model} verwendet

Dieser Fehler wird ausgelöst, wenn der Dekorator with_config für eine Klasse verwendet wird, die bereits ein Pydantic-Modell ist (verwenden Sie stattdessen das Attribut model_config ).

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 wird für eine BaseModel Unterklasse verwendet

Dieser Fehler wird ausgelöst, wenn der Pydantic- dataclass für eine Klasse verwendet wird, die bereits ein Pydantic-Modell ist.

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'

本文总阅读量