python / python/mypy

Missing TypeIs narrowing with covariant generic

Ouverte
#21,641 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug topic-type-narrowing topic-typeguard-typeis
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Utilisez le snippet Python minimal de l’issue comme reproducer, puis comparez le narrowing covariant de Source[Any] avec le cas contravariant fonctionnel de Sink[Never]. C’est terminé lorsque reveal_type(x) vaut int après assert not is_source(x), tout en préservant le comportement existant de Sink.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
50/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.