python / python/mypy

Cannot combine NewType and Literal

Aperta
#9,650 1 commento 2 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

feature topic-literal-types topic-newtype
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

(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.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia ricostruendo come mypy convalida il secondo argomento di NewType e come rappresenta i tipi Literal, usando l'esempio Baz = NewType("Baz", Foo) e l'errore di subclassability segnalato. Definisci il comportamento atteso del controllo dei tipi per un NewType derivato da Literal, quindi aggiungi una coverage che mostri la definizione accettata e i relativi vantaggi per il controllo dei tipi.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
compilers
Tipo di issue
Funzionalità
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.