Incorrect type inferencing when parameterizing with Self-like type variable involving `__ge__`
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 28/100
Piste de recherche
Commencez par exécuter le reproducer fourni avec la version actuelle de mypy et tracer l’inférence pour foo, en particulier le paramètre SupportsComparison de type Self et les méthodes ge. Localisez les tests d’inférence de types pertinents ou ajoutez un test de régression pour l’exemple ; le travail est terminé lorsque reveal_type signale tuple[float, float] plutôt que tuple[Fraction, float].
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Found a very strange bug involving self-like type variables while using __ge__ and similar methods. The following example defines:
- a parameterized protocol
SupportsComparisonwhich takesSelfas its first parameter and the type being compared to with its other parameter, - a protocol
SupportsRaddwhich allows type-hintingtype(t + supports_radd) == type(t), - a function
fooshould then acceptfoo(x, y, z)wherexsupports comparison withyandzsupports radd withxand returns(x, y).
In the example, foo(float, float, Fraction) -> tuple[float, float] is the expected result, since:
floatsupports comparison withfloatandselfshould befloat, meaningx: SupportsComparison[float, float],Fractionsupports radd withfloat, meaningz: SupportsRadd[float].
However, the result given by reveal_type(...) gives tuple[Fraction, float]. How is this the case?
from typing import Any, Protocol, TypeVar
T = TypeVar("T")
T_con = TypeVar("T_con", contravariant=True)
Self = TypeVar("Self", bound="SupportsComparison[Any, Any]", covariant=True)
class SupportsComparison(Protocol[Self, T_con]):
def __ge__(self: Self, other: T_con) -> bool: ...
def __gt__(self: Self, other: T_con) -> bool: ...
def __le__(self: Self, other: T_con) -> bool: ...
def __lt__(self: Self, other: T_con) -> bool: ...
class SupportsRadd(Protocol[T]):
def __radd__(self, other: T) -> T: ...
X = TypeVar("X", bound=SupportsComparison[Any, Any])
Y = TypeVar("Y")
Z = TypeVar("Z", bound=SupportsRadd[Any])
def foo(
x: SupportsComparison[X, Y],
y: Y,
z: SupportsRadd[X],
) -> tuple[X, Y]:
return (x, y)
from fractions import Fraction
reveal_type(foo(float(), float(), Fraction())) # Revealed type is "Tuple[fractions.Fraction*, builtins.float*]"
- Mypy version:
0.942. - Python version used:
3.10.0.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
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.
Autres issues de python/mypy
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
-
documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
bug topic-configuration topic-error-reporting
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Toutes les issues de python/mypy
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
zostera/django-bootstrap4#894 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
use-agent-os/agent-os#3276 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
zephyrproject-rtos/zephyr#119726 ·
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
zilliztech/memsearch#759 ·