python / python/mypy

Can't check only submodules (except if installed with `pip install -e .`)

Offen
#15,655 1 Kommentar 3 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

Checking a submodule only of a project seems impossible, when not installed using pip install -e .

Usecase:
I have project that contains auto-generated API code which is not correctly typed.
I only want to check the controllers that are located in a submodule.

To Reproduce

  1. Create a example project with the following structure
.
├── setup.py
└──src
    └── example_project
        ├── __init__.py
        ├── calc.py
        ├── py.typed
        └── sub
            ├── __init__.py
            └── foo.py

src/example_project/calc.py :

def int_add(a: int, b: int) -> int:
    """
    Simply add two numbers
    """
    return a + b


def float_diff(a: float, b: float) -> float:
    """
    Diff two numbers
    """
    return a / b


if __name__ == "__main__":
    int_add("a", "b")

src/ems_example_project/sub/foo.py:

import example_project.calc

example_project.calc.int_add("foo", "bar")

a: int = 1
a = "2"
  1. Install the package with pip install . OR do not install it at all.

  2. Run mypy for the given submodule

mypy src/example_project/sub

Expected Behavior

Only type errors for the submodule are found:

src/example_project/sub/foo.py:3: error: Argument 1 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:3: error: Argument 2 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")  [assignment]
Found 3 errors in 1 file (checked 2 source files)

This actually works, if I install the package with pip install -e ..
But I expect this to work no matter if I install the package normally or not installing it at all.

Actual Behavior

The type errors for the top level modules are also listed.

src/example_project/calc.py:21: error: Argument 1 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/calc.py:21: error: Argument 2 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:3: error: Argument 1 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:3: error: Argument 2 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")  [assignment]
Found 5 errors in 2 files (checked 2 source files)

If I use the option -p example_project.sub instead of the path it works as expected. But in my environment I am only able to add specific files (think pre-commit or similar).
It also works if I install the package using pip install -e.
Still I would not expect a such a difference just depending on how I installed the package.

Your Environment

  • Mypy version used: 1.4.1
  • Mypy command-line flags: none besides the path to the file
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: 3.9.16

This might be related to:

  • #10956
  • #10260
  • #6861
  • #10428

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem gemeldeten setup.py-Aufbau und reproduziere den Unterschied zwischen mypy src/example_project/sub, -p example_project.sub und einer bearbeitbaren bzw. normalen Installation. Vergleiche die Diagnosen aus calc.py und sub/foo.py und verfolge anschließend das pfadbasierte Verhalten bei der Modulerkennung. Als erledigt gilt, wenn die Prüfung nur des angeforderten Submoduls die drei erwarteten Fehler ergibt, ohne zusätzlich calc.py zu prüfen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.