Missing TypeIs narrowing with covariant generic
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
Mypy fails to narrow away an Any-specialized covariant generic after TypeIs narrowing to its object specialization:
from typing import Any, Generic, TypeVar
from typing_extensions import TypeIs
T_co = TypeVar("T_co", covariant=True)
class Source(Generic[T_co]): ...
def is_source(x: object) -> TypeIs[Source[object]]:
return False
def f(x: int | Source[Any]) -> None:
assert not is_source(x)
reveal_type(x) # expect int, mypy reveals int | Source[Any]
In contrast this does work correctly with an analogous contravariant type:
from typing import Any, Generic, TypeVar
from typing_extensions import Never, TypeIs
T_contra = TypeVar("T_contra", contravariant=True)
class Sink(Generic[T_contra]): ...
def is_sink(x: object) -> TypeIs[Sink[Never]]:
return False
def f(x: int | Sink[Any]) -> None:
assert not is_sink(x)
reveal_type(x) # int
(Found in python/typeshed#15931.)
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Usa lo snippet Python minimo presente nell’issue come riproduttore, quindi confronta il narrowing covariante di Source[Any] con il caso contravariante funzionante di Sink[Never]. Il lavoro è completato quando reveal_type(x) è int dopo assert not is_source(x), preservando il comportamento esistente di Sink.
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à
- Tranquilla
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 50/100