Pydantic模型带默认值字段未通过类型检查,如何免传参实例化并保留类型检查?
解决方案
问题出在Field(None)的用法上:你把None传给了Field的第一个位置参数(即描述信息description),而非default参数,导致field_b实际上没有设置默认值。虽然类型标注是Optional[bool],但Pyright会因为没有默认值判定它是必填参数。
可以通过以下两种方式解决,同时保留类型检查:
方式一:正确配置Field的default参数
修改field_b的定义,明确指定default参数:
from pydantic import BaseModel, Field from typing import Optional class AModel(BaseModel): field_a: str = Field() field_b: Optional[bool] = Field(default=None) instance_2 = AModel(field_a="") # 不再报错,Pyright能识别field_b是可选参数
方式二:简化默认值写法(无需Field时)
如果不需要Field的额外配置(比如验证规则、描述等),直接给字段赋值默认值即可:
from pydantic import BaseModel from typing import Optional class AModel(BaseModel): field_a: str = Field() field_b: Optional[bool] = None instance_2 = AModel(field_a="") # 正常实例化,类型检查有效
优化kwargs的类型检查
对于instance_3的场景,避免使用dict[str, Any](会丢失类型检查),改用TypedDict定义符合模型参数的类型:
from pydantic import BaseModel, Field from typing import Optional, TypedDict class AModel(BaseModel): field_a: str = Field() field_b: Optional[bool] = Field(default=None) class AModelKwargs(TypedDict): field_a: str field_b: Optional[bool] kwargs: AModelKwargs = {"field_a": "", "field_b": True} instance_3 = AModel(**kwargs) # Pyright会检查键名和类型,传入错误键(如field_bad)会报错
内容的提问来源于stack exchange,提问作者AJP
相关产品推荐
相关产品推荐

