python / python/mypy

Error when using Protocol and different __init__() signatures

Offen
#9,597 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug priority-2-low topic-join-v-union topic-protocols
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
Ø Merge
1 T. 18 Std.
Gemergte PRs (30 T.)
54

Beschreibung

I'm getting mypy errors when using Protocol with classes that have different __init__() signatures. In the following example, function bar() causes an error:

from typing import Dict, Type
from typing_extensions import Protocol


class HasName(Protocol):
    name: str


class Class1(HasName):
    name = 'class1'

    def __init__(self, a: int):
        pass


class Class2(HasName):
    name = 'class2'

    def __init__(self, a: int, b: int):
        pass


class Class3(HasName):
    name = 'class3'

    def __init__(self, a: int):
        pass


# OK
def foo() -> Dict[Type[HasName], int]:
    d = {}
    for cls in (
        Class1,
        Class3,
    ):
        d[cls] = 1
    return d

# error: Incompatible return value type (got "Dict[ABCMeta, int]", expected "Dict[Type[HasName], int]")
def bar() -> Dict[Type[HasName], int]:
    d = {}
    for cls in (
        Class1,
        Class2,
        Class3,
    ):
        d[cls] = 1
    return d


# OK
def baz(a: int) -> Type[HasName]:
    if a == 1:
        return Class1
    elif a == 2:
        return Class2
    else:
        return Class3

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 Minimalbeispiel des Issues mit mypy auszuführen und zu untersuchen, wie heterogene Klassentupel inferiert werden, wenn sich ihre init()-Signaturen unterscheiden. Die Aufgabe ist abgeschlossen, wenn die bar()-Funktion des Beispiels konsistent mit foo() und baz() akzeptiert wird und ein Regressionstest dieses Verhalten abdeckt.

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

Neue Issues direkt in Ihr Postfach

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