python / python/mypy

Support type narrowing on __eq__ with TypeGuard/TypeIs

Ouverte
#20,779 1 commentaire 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

feature 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

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

  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

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

Recevez les nouvelles issues par e-mail

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