
Mypy 的 exclude 选项仅在文件由 mypy 自动发现时生效;若文件已被 pytest 等工具显式收集并传入,mypy 将忽略 exclude 规则——这是设计行为,非 bug。
mypy 的 `exclude` 选项仅在文件由 mypy 自动发现时生效;若文件已被 pytest 等工具显式收集并传入,mypy 将忽略 `exclude` 规则——这是设计行为,非 bug。
当你在项目中配置 mypy.ini 并设置 exclude=FolderNotIgnored/,本意是让 mypy 跳过该目录下的类型检查。但实际运行 pytest --mypy 时,FolderNotIgnored\hello.py 仍被检查——根本原因在于:pytest 在调用 mypy 前已主动发现并显式传递了该文件路径。根据 mypy 官方文档,当文件以命令行参数形式直接传入 mypy(如 mypy FolderNotIgnored/hello.py),所有 exclude、files 等配置均被绕过。
因此,解决的关键不在 mypy 配置,而在于阻止 pytest 收集目标文件或目录。以下是两种主流方式:
✅ 方式一:命令行临时忽略(推荐用于调试)
pytest --ignore FolderNotIgnored --mypy
注意:--ignore 后跟的是路径名(不带斜杠),且需放在 --mypy 之前,确保 pytest 在收集阶段就跳过该目录。
✅ 方式二:配置文件永久忽略(推荐用于项目)
在 pyproject.toml 中添加:
[tool.pytest.ini_options] norecursedirs = ["FolderNotIgnored", "__pycache__", ".git"]
⚠️ 注意:
norecursedirs不支持尾部斜杠(如"FolderNotIgnored/"会失效),也不支持通配符或正则;它仅匹配目录名(basename),且对子目录递归生效。
❌ 错误做法示例(不会生效):
- 在
mypy.ini中增加files = ["helloroot.py"]—— 无法覆盖 pytest 显式传参; - 使用
exclude = "^FolderNotIgnored"—— mypy 的exclude是正则,但前提是文件由 mypy 自主扫描,而 pytest 已接管路径发现。
? 额外建议:若需更精细控制(如按文件名模式忽略),可结合 pytest 的 --ignore-glob:
pytest --ignore-glob="**/FolderNotIgnored/**" --mypy
总结:mypy exclude 失效不是 bug,而是工具链协作的预期行为。务必分清「路径发现权」归属——pytest 负责收集,mypy 负责检查;控制源头(pytest),才能真正实现忽略。

















