pyproject.toml中packages属性为何影响mypy的类型检查行为?
问题原因
在pyproject.toml里添加packages配置后,Poetry会将该项目识别为标准可安装Python包。执行poetry install时,项目会以可编辑开发模式链接到虚拟环境的site-packages目录。此时mypy会把some_module判定为已安装的第三方依赖,而mypy默认不会检查第三方包的内部代码——这就是明显的类型错误未被检测到的核心原因。
移除packages属性后,Poetry不会将项目注册为正式包,mypy会把所有文件视为本地项目源码,自然会扫描所有导入代码的类型问题。
解决方案(保留packages属性)
以下几种方法均可让mypy恢复对内部模块的类型检查:
方法1:在pyproject.toml中配置mypy检查范围
直接在pyproject.toml中添加mypy配置,明确指定要检查的文件或包:
[tool.mypy] # 可选:开启严格模式,强化检查强度 strict = true # 指定需要检查的目录和入口文件 include = ["some_module/**/*.py", "reproducer-main.py"]
或者精准指定项目内的包:
[tool.mypy] packages = ["some_module"]
方法2:运行mypy时显式指定检查目录
执行mypy命令时,除主文件外额外加上模块目录路径:
poetry run mypy reproducer-main.py some_module/
这样mypy会同时扫描主文件和模块目录下的所有代码,检测类型错误。
方法3:配置mypy识别本地包基础
如果项目是标准包结构(每个子目录下有__init__.py),可开启mypy的包基础识别选项,让它正确识别本地包:
[tool.mypy] explicit_package_bases = true # 指定源码根目录为当前目录 mypy_path = "."
内容的提问来源于stack exchange,提问作者Newbyte
相关产品推荐
相关产品推荐

