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

通过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目录文件重复识别问题

有两种处理方式:

  1. 在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
  1. 在mypy配置文件.github/linters/.mypy.ini中添加排除规则:
[mypy]
exclude = ^tests/

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:47