pytest-mypy本身不执行类型检查,真正干活的是本地mypy;默认只检查测试文件而非源码,需显式配置mypy_targets指定src/等路径,并确保mypy配置放在项目根目录的pyproject.toml([mypy]段)或mypy.ini中。

pytest-mypy 插件本身不执行类型检查,它只是把 mypy 调用包装成 pytest 的一个收集项——真正干活的是你本地安装的 mypy,且必须版本兼容。
为什么 pytest-mypy 运行后没报错,但实际类型错误没被发现?
常见原因是 mypy 没有正确配置或未启用类型检查入口。pytest-mypy 默认只对测试文件(如 test_*.py)运行 mypy,而不会自动扫描你的源码目录。
- 默认行为:只检查当前 pytest 收集到的测试文件(即匹配
python_files配置的*test.py、test_*.py等),不是项目源码 - 解决办法:在
pyproject.toml或setup.cfg中显式指定mypy_targets,例如:[tool.pytest.ini_options] mypy_targets = ["src/", "tests/"]
- 注意:路径需存在且为 mypy 可识别的 Python 模块路径;若用相对路径,以 pytest 执行位置为基准
如何让 pytest-mypy 使用特定 mypy 配置(如 pyproject.toml 中的 [mypy])?
pytest-mypy 会自动读取项目根目录下的 pyproject.toml、mypy.ini 或 .mypy.ini,但有一个关键限制:它不支持 mypy 的 --config-file 参数覆盖逻辑,仅认默认位置。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 必须把 mypy 配置放在项目根目录,且文件名严格为
pyproject.toml(含[mypy]section)或mypy.ini - 如果配置在
pyproject.toml中,确保 section 名是[mypy],不是[tool.mypy]—— 后者是旧版写法,pytest-mypy 不识别 - 常见坑:
disallow_untyped_defs = true在配置中生效,但若某文件被[[mypy.*]]子配置排除,pytest-mypy 也会跳过它
遇到 “ImportError: cannot import name '...' from 'mypy.api'” 怎么办?
这是 pytest-mypy 和 mypy 版本不匹配的典型错误,尤其发生在 mypy ≥ 1.0 之后,其内部 API 有重大变更。
- 检查兼容性:pytest-mypy ≤ 0.10.3 仅支持 mypy
- 推荐组合:
pip install "mypy>=1.5.0" "pytest-mypy>=0.12.0"
- 验证方式:运行
python -c "from mypy.api import run"不报错,再确认pytest --mypy是否能触发检查 - 如果用 poetry,注意 lock 文件可能固定了旧版 mypy,需
poetry update mypy并重装 pytest-mypy
真正难的不是加插件,而是让 mypy 的检查范围、配置粒度和 CI 中的失败阈值对齐——比如是否允许部分文件忽略、是否把 reveal_type() 当作测试断言、要不要在 CI 中禁止 # type: ignore 出现。这些都得靠 mypy 自身配置驱动,pytest-mypy 只负责“跑起来”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










