如何为父类BaseModel添加类型提示,让子类可为部分字段设默认值
解决Pydantic子类设置默认值后mypy提示缺少父类字段的问题
你遇到的问题是因为子类中直接赋值first = "1"的方式没有被Pydantic和mypy识别为字段的默认值,父类里的first: str被标记为必填字段,所以mypy会报错。要解决这个问题,需要在子类中显式声明字段的类型并设置默认值,让类型检查工具和Pydantic都能识别这些值是字段的默认值。
修正方案1:显式添加类型注解并设置默认值
from pydantic import BaseModel class Parent(BaseModel): first: str second: str third: str def run(self): print(self.first + self.second + self.third) class Child(Parent): first: str = "1" # 明确标记为str类型并设置默认值 second: str = "2" c = Child(third="3") # mypy不再报错 c.run() # 输出结果:123
修正方案2:使用Pydantic的Field定义默认值
如果需要更复杂的字段配置(比如添加描述、验证规则),可以用Field来设置默认值:
from pydantic import BaseModel, Field class Parent(BaseModel): first: str second: str third: str def run(self): print(self.first + self.second + self.third) class Child(Parent): first: str = Field(default="1") second: str = Field(default="2") c = Child(third="3") # mypy不再报错
为什么原来的写法不行?
直接写first = "1"只是给Child类添加了一个普通类属性,并没有覆盖父类中定义的first字段的必填性。通过显式添加类型注解(或用Field),Pydantic会将其识别为字段的默认值,同时mypy也能正确推断这两个参数不再是实例化时的必填项。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

