python / python/mypy

False positive error "incompatible type" on bound TypeVar

Offen
#13,596 1 Kommentar 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-inheritance topic-type-variables
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Originally posted on gitter july 29th, where it was suggested I open a bug report

Bug Report
For this code:

from typing import Generic, TypeVar, Union

ListT = TypeVar("ListT", str, float)


class TestListA(Generic[ListT]):
    def __init__(self, device: ListT) -> None:
        self._device: ListT = device


class TestListB(TestListA[ListT]):
    def __init__(self, device: ListT) -> None:
        super().__init__(device)

mypy outputs error:

test.py:13: error: Argument 1 to "__init__" of "TestListA" has incompatible type "str"; expected "ListT"  [arg-type]
test.py:13: error: Argument 1 to "__init__" of "TestListA" has incompatible type "float"; expected "ListT"  [arg-type]

which is false positive.

Please note that when using a TypeVar with bound=Union, then mypy doesn't complain.

ListT = TypeVar("ListT", bound=Union[str, float])

Your Environment

  • Mypy version used: mypy 0.971 (compiled: yes)
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files):
  • Python version used: Python 3.9.12
  • Operating system and version:

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 damit, das bereitgestellte TestVar-Beispiel mit mypy 0.971 zu reproduzieren, und vergleiche anschließend sein Verhalten bei eingeschränktem TypeVar mit der Variante bound=Union. Finde den Pfad der Typprüfung für TestListB.init und füge eine Regressionstestabdeckung für die False-Positive-Diagnosen hinzu. Als erledigt gilt die Aufgabe, wenn das eingeschränkte Beispiel ohne Fehler durchläuft, während inkompatible Aufrufe weiterhin diagnostiziert werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

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

Neue Issues direkt in Ihr Postfach

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