Python 静态类型检查的 mypy 配置

1次阅读

mypy默认按pyproject.toml、mypy.ini、.mypy.ini顺序从当前目录向上查找配置;推荐用pyproject.toml的[tool.mypy]段,运行时加–show-config确认加载情况。

Python 静态类型检查的 mypy 配置

mymypy 配置文件该放哪、叫什么名

默认不找 pyproject.toml,除非你显式指定或用新版 mypy(v1.0+)。老项目常见坑:配了 mypy.ini 却没生效,其实是 mypy 根本没读到它。

  • mypy 会按顺序查找:pyproject.toml(推荐)、mypy.ini.mypy.ini,从当前工作目录往上逐级找,找到第一个就停
  • 如果用 pyproject.toml,必须把配置放在 [tool.mypy] 段下,不是 [mypy][tool]
  • 运行 mypy 时加 --show-config 能确认它实际加载了哪个文件、哪些选项

关键配置项:哪些必须开,哪些建议关

开太多检查会让团队立刻放弃;关太多等于白配。核心是守住「空值」和「类型擦除」这两条线。

  • 必开:disallow_untyped_defs = true(函数必须有类型注解),disallow_incomplete_defs = true(不能只写 def foo() -> int: 却不写 body)
  • 慎开:check_untyped_defs = true(检查无类型函数的内部逻辑)——对旧代码杀伤力大,建议逐步开启
  • 建议关:warn_return_any = false(否则 def f(): return some_lib_call() 会狂报错,而很多库没类型提示)
  • 兼容性注意:python_version = "3.10" 必须和项目实际运行版本一致,否则 list[str] 这类字面量语法会被拒

如何让 mypy 忽略第三方库或特定文件

报错里一 Module has no Attribute "xxx"?大概率是库没提供 stub,而不是你写错了。

  • 忽略整个包:[[tool.mypy.overrides]] + module = "requests.*" + ignore_missing_imports = true
  • 忽略单个文件:files = ["tests/**.py"] 或直接在文件头加 # mypy: ignore-Errors
  • 不要用 follow_imports = "silent" 全局关闭导入检查——它会让类型推导彻底失效,表面安静,实则埋雷
  • 想补第三方库类型?优先装 types-xxx 包(如 pip install types-requests),比盲目 ignore 更可靠

CI 里跑 mypy 的最小安全姿势

本地能过,CI 报错?八成是环境差异或路径问题。

立即学习Python免费学习笔记(深入)”;

  • 命令别只写 mypy .,改用 mypy --show-traceback --no-error-summary src/ tests/,暴露真实错误位置
  • 确保 CI 使用的 Python 版本和 pyproject.tomlpython_version 一致,否则 LiteralSelf 会直接解析失败
  • 避免 mypy --install-types 自动装 stub——它可能装错版本,CI 应该靠 requirements-dev.txtpyproject.toml [tool.poetry.group.dev.dependencies] 固化依赖
  • 如果项目用了 src/ 结构,记得加 packages = ["src"],否则 mypy 找不到模块顶层

最常被跳过的其实是 --show-config--show-traceback 这两个开关。没它们,你看到的往往不是问题本身,而是 mypy 猜的结论。

text=ZqhQzanResources