为何mypy未检出dataclass成员调用不存在方法的类型错误
问题根因
mypy默认仅对带有类型标注的函数/方法执行内部逻辑检查,没有任何类型标注的方法会被直接跳过校验。你代码中的fill_thing方法没有添加任何类型注解,因此mypy不会检查其内部的self.thing.do_wrong_way()调用,自然不会抛出属性不存在的错误。
而你给出的第二段测试代码属于模块顶层代码,mypy默认会对所有顶层代码执行类型校验,因此可以正确识别到[attr-defined]错误。
修复方案
可任选以下任意一种方式开启对该方法的类型检查:
- 给
fill_thing方法添加返回值类型标注,修改为def fill_thing(self) -> None:,mypy会自动对带标注的方法做内部校验,此时就能正确抛出属性不存在的错误。
示例修改后代码:@dataclass class Holder: thing: RightThing def fill_thing(self) -> None: self.thing.do_wrong_way() # mypy 报错:"RightThing" has no attribute "do_wrong_way" [attr-defined] - 运行mypy时添加
--check-untyped-defs启动参数,强制检查所有无类型标注的函数/方法内部逻辑。 - 在项目mypy配置文件(
mypy.ini/pyproject.toml)中添加check_untyped_defs = True,全局开启无标注方法的检查规则。
内容的提问来源于stack exchange,提问作者Ben Kovitz
相关产品推荐
相关产品推荐

