Wrong Signature for Enum with Specific Dataclass Mixin Scenario

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

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
55/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Ruhig
Tech-Stack
python

Rechercherichtung

Beginne mit der Python-Reproduktion und dem verknüpften pyright playground und vergleiche die abgeleiteten Signaturen für SampleEnum und SampleEnum2. Verfolge die relevanten Typing-Definitionen für enum und dataclass aus der Standardbibliothek in typeshed und bestätige den Abschluss, sobald der dataclass-mixin-Fall die beabsichtigte enum-Konstruktor-Signatur erzeugt, ohne das Laufzeitverhalten zu ändern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Note: I was thinking about putting this on pyright but it said standard library problems are more suited here, so I'll give it a shot.

I was trying to code an enum with a dataclass mixin where each value is overridden through the first string variable for easier referencing (rather than a dict from str to enum).

from dataclasses import dataclass
from enum import Enum, auto

@dataclass(frozen=True)
class SampleMixin:
    a_string: str
    a_number: int

class SampleEnum(SampleMixin, Enum):
    def __new__(cls, value: str, *_):
        obj = object.__new__(cls)
        obj._value_ = value

        return obj

    foo = "foo", 1
    bar = "bar", 2

class SampleEnum2(Enum):
    foo = auto()
    bar = auto()

baz = SampleEnum("foo")
qux = SampleEnum2("foo")

baz still gets SampleEnum.foo right, but the function signature is incorrectly identified. Ideally, it should be closer to SampleEnum2's function signature.

Image

I'm open to workarounds at the meantime. The code runs correctly, it's just that the inferred signature I got was wrong.

Code sample in pyright playground.

Vorherrschende Sprache
Python
Sterne
5.1k
Forks
2.1k
Ø Merge
2 T. 1 Std.
Gemergte PRs (30 T.)
115

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus python/typeshed

Alle Issues in python/typeshed

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

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