确认mypy真正在工作:先通过命令面板选择python: select linter并手动选mypy;保存python文件后检查“问题”面板是否出现类型错误提示;终端运行which mypy或where mypy验证安装路径;确保python解释器与项目环境一致,且settings.json中python.linting.mypyargs为正确数组格式。

mypy 在 VSCode 里不报错,基本就是它根本没跑起来——不是配置漏了,就是被 Pylance 静默接管了。
怎么确认 mypy 真正在工作
VSCode 默认用 Pylance 做实时类型检查,它不等于 mypy;即使你装了 mypy、勾了启用,也不代表它真在 lint。最直接的验证方式是打开命令面板(Ctrl+Shift+P 或 Cmd+Shift+P),搜 Python: Select Linter,必须手动选中 mypy(不是 pylint、flake8,也不是留空)。选完后保存一个 Python 文件,看“问题”面板里是否出现类似 Argument 1 to "greet" has incompatible type "int"; expected "str" 这样的提示。
- 如果没反应,先运行终端命令
which mypy(macOS/Linux)或where mypy(Windows),确保返回有效路径;没返回就pip install mypy - 如果返回了路径但 still 不报错,检查当前工作区是否激活了正确的 Python 解释器(底部状态栏看 interpreter 路径),mypy 必须和项目环境一致
- 注意:VSCode 只对已打开的文件做 lint,
foo.py里调用了bar.py的函数但bar.py没打开,mypy 就不会检查bar.py里的类型定义
settings.json 里 mypyArgs 怎么写才不静默失败
python.linting.mypyArgs 是个敏感字段,格式错一点(比如用字符串代替数组、引号不匹配、路径斜杠反了)就会让整个配置失效,且无任何错误提示。
- 必须用 JSON 数组格式:
"python.linting.mypyArgs": ["--strict", "--show-column-numbers"],不能写成"--strict --show-column-numbers" -
--python-executable很关键:如果你用 venv 或 conda,不指定就可能走系统 Python,导致找不到包或 stub;填./venv/bin/python(Linux/macOS)或./venv/Scripts/python.exe(Windows) - 别加
--file或--follow-imports:VSCode 自己控制检查范围,硬加反而干扰;调试时可临时加--show-traceback看报错源头 - Windows 下正则排除路径要小心:
"--exclude", "tests\.*"(四个反斜杠),写成"tests.*"会解析失败
mypy 和 Pylance 能不能一起用,怎么避免冲突
能共存,但职责必须分清:Pylance 负责编辑时实时反馈(快、轻量、带推断),mypy 负责保存时严格校验(准、重、按 PEP 规范)。两者同时开没问题,但容易踩的坑是配置互相覆盖。
- 确保
python.linting.enabled为true,且python.linting.mypyEnabled明确设为true -
python.analysis.typeCheckingMode推荐设为"basic"或"strict",但它只影响 Pylance,不影响 mypy 行为;mypy 的严格程度由mypyArgs或mypy.ini控制 - 如果项目根目录有
pyproject.toml或mypy.ini,mypy 会优先读它们;VSCode 的mypyArgs只是补充,不是覆盖 - 新版 VSCode Python 扩展(v2023.10+)支持 mypy ≥ 1.0 的 JSON 输出格式;老版本插件只认文本输出,会导致错误不显示——升级插件比降级 mypy 更稳妥
为什么改了配置还是看不到错误,最容易忽略的一点
VSCode 的 mypy lint 只在文件保存时触发(不是实时),而且只检查当前打开的文件及其显式导入链。你改了 settings.json,但没保存任意一个 Python 文件,或者没重新加载窗口(Developer: Reload Window),配置就不会生效。更隐蔽的是:如果你用 pyproject.toml 配置 mypy,里面写了 [[tool.mypy.overrides]] 并 exclude 了某些目录,而你正在编辑的文件恰好落在那个路径下,那它就被 mypy 主动跳过了——这时候无论 VSCode 设置多正确,也看不到任何提示。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











