[Python] pre-commit: Mypy local hook reports the same error multiple times

Discussão em 'Python' iniciado por Stack, Novembro 28, 2025.

  1. Stack

    Stack Membro Participativo

    Problem


    Mypy as a local hook reports the same error multiple times.

    related issues


    Difference between running Mypy directly VS with pre-commit run --all-files

    .pre-commit-config.yaml


    - repo: local
    hooks:
    - id: mypy
    name: mypy
    # or `entry: poetry run mypy`, but perhaps both are the same
    entry: mypy
    # From the docs it is not clear the difference between `language: python` VS `language: system`
    language: system
    types: [ python ]

    sample file


    Let's make some silly mistake only to trigger Mypy warnings, e.g.:

    # sample.py

    foo: int = "bar"


    Note: there are many other files in the project.

    pre-commit run --all-files output


    The same mistake reported 3 times:

    pre-commit run mypy --all-files
    mypy.....................................................................Failed
    - hook id: mypy
    - exit code: 1

    src/sample.py:12:12: error: Incompatible types in assignment (expression
    has type "str", variable has type "int") [assignment]
    foo: int = "bar"
    ^
    Found 1 error in 1 file (checked 23 source files)
    src/sample.py:12:12: error: Incompatible types in assignment (expression
    has type "str", variable has type "int") [assignment]
    foo: int = "bar"
    ^
    Found 1 error in 1 file (checked 23 source files)
    src/sample.py:12:12: error: Incompatible types in assignment (expression
    has type "str", variable has type "int") [assignment]
    foo: int = "bar"
    ^
    Found 1 error in 1 file (checked 23 source files)
    src/sample.py:12:12: error: Incompatible types in assignment (expression
    has type "str", variable has type "int") [assignment]
    foo: int = "bar"
    ^
    Found 1 error in 1 file (checked 22 source files)

    mypy src/ output


    The mistake is reported only once, which is a correct behavior:

    src/cache/cache.py:12:12: error: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment]
    foo: int = "bar"
    ^
    Found 1 error in 1 file (checked 91 source files)


    git ls-files --exclude='*.py' --ignored -c -z | xargs -0r mypy output (try to reproduce "pre-commit" behaviour):

    • the same as above (the warning reported only once)
    Question


    How to avoid duplicate warnings and still use Mypy via "pre-commit"?

    PS:

    Do not propose me to use https://github.com/pre-commit/mirrors-mypy. It is overkill for my huge project to copy/paste manually dozens of my dependencies to the additional_dependencies to create one more virtual environment. These dependencies will be unpinned, and I will need to update them manually every time I add/remove something. It is only a redundant duplicate work. Anyway, I used to use "mirrors-mypy" before, and it stopped to give consistent results with the plain Mypy. This is why I am trying to use Mypy as a local hook. Currently, I simply run plain Mypy in my CI/CD as one job, and the "pre-commit" with all other hooks as a separate job.

    Continue reading...

Compartilhe esta Página