为什么mypy扫描目录和扫描单个文件时输出的错误结果不一致?
差异产生的核心原因
你使用的mypy 0.910版本存在默认模块检查规则:
- 执行目录级扫描(
mypy .)时,默认仅对标记为类型友好(即模块目录下存在py.typed标识文件)的模块执行全量类型校验;未标记的模块仅会做第三方库导入合法性校验,不会检查内部代码的类型注解缺失、无类型函数调用等问题。你测试用的pingouin仓库对应提交版本中,pingouin模块目录下没有py.typed标识文件,因此目录扫描时仅输出了导入相关错误。 - 直接指定单个文件路径执行
mypy <文件路径>时,mypy会绕过上述模块检测规则,强制对指定文件执行全量规则检查,因此会输出你预期的所有错误。
统一输出的配置方法
通过修改mypy配置文件(项目根目录下的mypy.ini、pyproject.toml或.mypy.ini)即可让目录扫描输出和单文件扫描一致的全量错误,任选以下一种配置即可:
方法1:全局开启所有模块全量检查
如果是mypy.ini配置文件,添加如下内容:
[mypy] strict = true show_error_codes = true exclude = venv/ # 核心配置:强制检查所有模块,不受py.typed标记限制 check_untyped_defs = true disallow_untyped_defs = true no_silent_imports = true
如果是pyproject.toml配置文件,添加如下内容:
[tool.mypy] strict = true show_error_codes = true exclude = "venv/" check_untyped_defs = true disallow_untyped_defs = true no_silent_imports = true
配置完成后先删除mypy缓存目录.mypy_cache,再执行mypy .即可得到和单文件扫描一致的结果。
方法2:仅对指定模块开启全量检查
如果你不需要检查所有模块,仅需要检查项目自有代码,可以单独指定模块检查规则,避免第三方依赖产生过多无关错误:
[mypy-pingouin.*] check_untyped_defs = true disallow_untyped_defs = true
配置后目录扫描时仅会对pingouin目录下的代码执行全量检查,其他模块保持默认校验规则。
内容的提问来源于stack exchange,提问作者baxx
相关产品推荐
相关产品推荐

