通过pre-commit运行mypy时遇重复模块等错误的求助
pre-commit 运行mypy 异常问题
仓库结构
my-repo/ .github/ linters/ .mypy.ini .pre-commit-config.yaml mypackage/ __init__.py main.py subpackage/ __init__.py foo.py tests/ conftest.py
问题现象
直接在终端执行mypy命令完全正常:
mypy --config-file=.github/linters/.mypy.ini mypackage
输出结果:
Success: no issues found in 23 source files
但用pre-commit执行全量检查时,mypy报错:
mypackage\__init__.py: error: Duplicate module named "mypackage" (also at "mypackage\__init__.py") mypackage\__init__.py: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#mapping-file-paths-to-modules for more info mypackage\__init__.py: note: Common resolutions include: a) using `--exclude` to avoid checking one of them, b) adding `__init__.py` somewhere, c) using `--explicit-package-bases` or adjusting MYPYPATH Found 1 error in 1 file (errors prevented further checking)
当前pre-commit配置如下:
repos: - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.3.0 hooks: - id: mypy args: [--config-file=.github/linters/.mypy.ini, mypackage]
已尝试过相关问题的建议,但问题依旧。
调整参数后的新问题
把pre-commit里mypy的参数改成args: [--config-file=.github/linters/.mypy.ini]后,还是有两类错误:
- 源文件被重复识别:
tests\conftest.py: error: Source file found twice under different module names: "conftest" and "tests.conftest"
- 第三方模块找不到实现或存根,比如:
mypackage\foo.py:1: error: Cannot find implementation or library stub for module named "uvicorn" [import]
解决办法
解决模块重复问题
pre-commit的mypy钩子默认会把所有待检查文件作为参数传给mypy,如果你手动在args里加了mypackage,就会导致mypy同时收到钩子传递的文件列表和你指定的目录,从而重复扫描。
修改pre-commit配置,移除手动指定的mypackage,添加--explicit-package-bases参数并指定要检查的包:
repos: - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.3.0 hooks: - id: mypy args: [--config-file=.github/linters/.mypy.ini, --explicit-package-bases, --package mypackage] additional_dependencies: - types-uvicorn # 按需添加第三方模块的类型存根包
解决第三方模块找不到的问题
pre-commit的mypy钩子运行在独立虚拟环境里,默认不会安装项目依赖。需要在additional_dependencies里添加需要的第三方包或对应的类型存根,比如uvicorn的类型存根是types-uvicorn,如果需要运行时依赖也可以直接加uvicorn。
解决tests目录文件重复识别问题
有两种处理方式:
- 在pre-commit钩子中添加
exclude字段,跳过tests目录:
repos: - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.3.0 hooks: - id: mypy args: [--config-file=.github/linters/.mypy.ini, --explicit-package-bases, --package mypackage] exclude: ^tests/ additional_dependencies: - types-uvicorn
- 在mypy配置文件
.github/linters/.mypy.ini中添加排除规则:
[mypy] exclude = ^tests/
内容的提问来源于stack exchange,提问作者tenticon
相关产品推荐
相关产品推荐

