python / python/mypy

Cannot combine NewType and Literal

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

Dieses Issue hat noch niemand übernommen.

feature topic-literal-types topic-newtype
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

(This seems related to, but different from, #2448.)

Feature

Allow the creation of a NewType derived from Literal.

Pitch

Currently you can define the following types:

Foo = Literal["foo"]
Bar = NewType("Bar", str)

But you can't do this:

Baz = NewType("Baz", Foo)

If you attempt to, Python won't throw any error, but mypy will complain:

error: Argument 2 to NewType(...) must be subclassable

This prevents a strict definition of a literal-based type: you either have to accept all values of the literal's type or you need to lose the type check benefits of NewType.

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 nachzuverfolgen, wie mypy das zweite Argument von NewType validiert und wie es Literal-Typen darstellt, anhand des Beispiels Baz = NewType("Baz", Foo) und des gemeldeten Fehlers zur Vererbbarkeit. Lege das erwartete Type-Checking-Verhalten für einen von Literal abgeleiteten NewType fest und füge anschließend Tests hinzu, die die akzeptierte Definition und ihre Vorteile beim Type-Checking zeigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers
Issue-Typ
Feature
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.