You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pre-commit的mypy钩子检查全部文件而非仅暂存文件的问题

解决pre-commit中mypy检查未暂存文件的问题

问题原因

这不是你传入的参数导致的,而是mypy的类型检查机制特性:
mypy作为类型检查器,会分析文件的依赖导入关系。当检查暂存的file1.py时,如果该文件导入了file2.py或file3.py,mypy会加载这些依赖文件来完成类型推导。由于你设置了--disallow-untyped-defs,这些依赖文件中未添加类型注解的函数会被检测出来,哪怕它们没有被暂存。

而flake8是语法/风格检查器,仅孤立检查单个文件的内容,不会追踪依赖,所以只会作用在暂存文件上,符合你的预期。

解决方案

方案1:让mypy跳过导入模块的类型检查

修改.pre-commit-config.yaml中mypy钩子的参数,添加--follow-imports=skip,让mypy只关注目标文件本身的类型问题:

- repo: https://github.com/pre-commit/mirrors-mypy
  rev: v1.7.0
  hooks:
    - id: mypy
      name: "check type hints"
      args: [--ignore-missing-imports, --disallow-untyped-defs, --follow-imports=skip]

方案2:忽略特定文件的类型错误

如果需要保留对依赖文件的检查,但忽略未暂存文件的特定错误,可以在项目的mypy配置文件(如pyproject.toml或mypy.ini)中添加规则:
以pyproject.toml为例:

[tool.mypy]
ignore_missing_imports = true
disallow_untyped_defs = true
per_file_ignores = [
    "file2.py:no-untyped-def",
    "file3.py:no-untyped-def",
]

之后可以去掉钩子中的对应args,让配置文件统一管理规则。

方案3:手动指定检查文件(不推荐)

提交前手动执行pre-commit并指定仅检查暂存文件:

pre-commit run --files $(git diff --cached --name-only -- '*.py')

此方法需要每次提交手动执行,不够便捷。

内容的提问来源于stack exchange,提问作者intervort

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:35:07