You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:36:03