python / python/mypy

overload, Protocol and generic self: annotations

Offen
#19,381 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-overloads topic-protocols topic-self-types
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

overload with a self annotation involving a protocol never get matched:

class Proto[A_contra](Protocol):
    def __call__(self, arg: A_contra, /) -> None: ...

class Fn:
    def __call__(self, arg: int, /) -> None:
        pass

@dataclass(frozen=True)
class Testclass[T_co]:
    val: T_co

    # this overload is problematic
    @overload
    def meth[T2](self: Testclass[Proto[T2]], arg: T2) -> int: ...
    @overload
    def meth(self, arg: None) -> str: ...
    def meth(self: Any, *args, **kwargs):
        return self.val

def fn(x: Testclass[Fn]):
    # error: No overload variant of "meth" of "Testclass" matches argument type "int"  [call-overload]
    # note: Possible overload variant:
    # note:     def meth(self, arg: None) -> str
    x.meth(5)

it works fine if it is not an overload, or if using Callable rather than Proto.
https://mypy-play.net/?mypy=latest&python=3.12&gist=39ec9991c68ca9ed50f149359459e858
this works fine in pyright.

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 minimalen Python-Beispiel und der im Issue verlinkten Reproduktion auf mypy-play.net und vergleiche dann das Ergebnis mit pyright. Verfolge den Pfad der Overload-Zuordnung für eine generische self-Annotation, die das Proto-Protokoll verwendet. Als abgeschlossen gilt die Aufgabe, wenn der erste Overload x.meth(5) wie gezeigt akzeptiert, ohne den None-Overload oder den Callable-Fall zu beeinträchtigen.

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
45/100

Neue Issues direkt in Ihr Postfach

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