python / python/mypy

Final (context-sensitive Literal) doesn't support type narrowing

Aperta
#19,814 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug topic-final topic-literal-types topic-type-narrowing
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Merge medio
1g 18h
PR unite (30g)
54

Descrizione

Bug Report

Maybe there's a reason this is not supported, but at a quick look it seems like it should work. When a union of context-sensitive Literals are used, it fails to perform type narrowing, whereas explicit Literals do work.

To Reproduce

from typing import Final, Literal

class TXTRecord:
    type: Final = "TXT"
    text: str = "Foo"

class ARecord:
    type: Final = "A"
    host: str = "192.168.1.1"

record: TXTRecord | ARecord
reveal_type(record.type)
if record.type == "TXT":
    print(record.text)  # error with Final, but not with Literal
else:
    print(record.host)  # error with Final, but not with Literal

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 eseguendo la riproduzione Python fornita e confronta il suo comportamento di narrowing con il caso equivalente di Literal esplicito. Il lavoro è completato quando l’unione basata su Final viene ristretta a TXTRecord e ARecord nei due rami senza produrre gli errori di attributo segnalati.

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

Valutazione

Stack tecnologico
python
Ambito
devtools
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Specificata chiaramente
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.