- https://docs.pydantic.dev /latest/concepts/fields/#numeric-constraints
- https://github.com/pydantic/pydantic/issues/8362
Могу ли я иметь необязательный ограниченный тип - в моем случае мне нужно поле, которое является необязательным[list[float] = None с ограничением что список должен состоять из двух элементов или иметь значение None после проверки.
Вот что у меня есть на данный момент...from typing import Annotated, Optional
from pydantic import AfterValidator, BaseModel, Field, ValidationError, ValidationInfo
def some_eventual_validation(value, info: ValidationInfo):
"""Dummy validator that eventually will do something (compare value to min/max)."""
return value
class OptionA(BaseModel):
min: Optional[float] = Field(None)
max: Optional[float] = Field(None)
value: Annotated[
Optional[list[float]],
AfterValidator(some_eventual_validation),
Field(
None,
min_length=2,
max_length=2,
validate_default=True,
),
]
try:
OptionA()
except TypeError as e:
print(e)
# In the case the default works, but it seems to apply the constraints from the Field annotation to the default value (which I believe is not the intended behavior for Optional fields)
class OptionB(BaseModel):
min: Optional[float] = Field(None)
max: Optional[float] = Field(None)
value: Optional[
Annotated[
list[float],
AfterValidator(some_eventual_validation),
Field(
None,
min_length=2,
max_length=2,
validate_default=True,
),
]
]
print("====")
try:
OptionB()
except ValidationError as e:
print(e)
# In this case, the default does not work --> shouldn't the code be able to infer the default from the Field annotation?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ydantic-v2