Следующий код показывает ошибку pylance (pyright) для AModel()
из Argument missing for parameter "field_b"
:
from pydantic import BaseModel, Field
from typing import Optional, Any
class AModel(BaseModel):
field_a: str = Field()
field_b: Optional[bool] = Field(None)
instance_1 = AModel(field_a = "", field_b=None) # No error
instance_2 = AModel(field_a = "") # Error
# ^^^^^^^^^^^^^^^^^^
kwargs: dict[str, Any] = {"field_a": "", "field_bad": True}
instance_3 = AModel(**kwargs) # No error but no type checking
Можно ли создать экземпляр этой модели, не предоставляя field_b=None
и сохраняя при этом проверку типов?
Вам нужно либо указать default=
явно, либо вообще отказаться от вызова Field()
:
class AModel(BaseModel):
field_a: str = Field()
field_b: Optional[bool] = Field(default=None)
### or
field_b: Optional[bool] = None
Как написано , Field
в Pydantic позволяет передавать default
позиционно:
Field(
default: Any = PydanticUndefined,
*,
# ...
) -> Any
Однако default
— это параметр спецификатора поля, а спецификация типизации требует, чтобы такие параметры были ключевыми словами — только для того, чтобы их можно было обнаружить средствами проверки типов (выделено мной):
Библиотеки, которые поддерживают семантику, подобную классам данных, и поддерживают классы спецификаторов полей, обычно используют общие имена параметров для создания этих спецификаторов полей. Эта спецификация формализует имена и значения параметров, которые необходимо понимать для средств проверки статических типов. Эти стандартизированные параметры должны содержать только ключевые слова.
См. также это обсуждение на GitHub, где сопровождающий Pyright опубликовал тот же ответ.
Великолепно. Большое спасибо.