Support type narrowing on __eq__ with TypeGuard/TypeIs
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Feature
Handle type narrowing when overridden __eq__ method has a return type annotated with TypeIs or TypeGuard.
Pitch
When defining custom __eq__ methods, it might be useful in some contexts to leverage type narrowing. For example, consider an assertion helper[^1] like the following:
import typing
T = typing.TypeVar("T")
class IsInstance(typing.Generic[T]):
def __init__(self, t: type[T]) -> None:
self.t = t
def __eq__(self, other: typing.Any) -> typing.TypeGuard[T]:
return isinstance(other, self.t)
v: typing.Any = 1
assert v == IsInstance(int)
typing.reveal_type(v) # Should ideally be "int"
Currently, mypy doesn't narrow the type. If we explicitly call __eq__, it works as intended:
v: typing.Any = 1
assert IsInstance(int).__eq__(v)
typing.reveal_type(v) # int
[^1]: It's admittedly a bit naive for the sake of the example, but we could imagine more complex stuff.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par localiser la logique de réduction de type pour les comparaisons et son traitement des annotations de retour TypeGuard et TypeIs. Vérifiez le comportement avec l’exemple IsInstance de l’issue : après assert v == IsInstance(int), reveal_type(v) devrait indiquer int, comme lors de l’appel explicite à eq.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Fonctionnalité
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 45/100