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
相关产品推荐
相关产品推荐

