Signatures of "__ior__" and "__or__" are incompatible when assigning __or__ with compatible method
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
Description
Bug Report
Dear mypy team,
I was implementing arithmetic operations on a custom class and ran into the following issue:
When I don't define __or__ in the class body, but assign it with a function with a compatible type, mypy complains about incompatible signatures of __ior__ and __or__. (This is also true for other arithmetic dunders, see example).
I wanted to only allow inplace operations on that class and throw a common error on non-inplace operations.
To Reproduce
# this works and does not throw an error
class A:
def __or__(self, v: int) -> A:...
def __ior__(self, v: int) -> None: ...
reveal_type(__or__) # note: Revealed type is "def (_error.A, builtins.int) -> _error.A"
reveal_type(__ior__) # note: Revealed type is "def (_error.A, builtins.int)"
# this errors
class B:
def _no(self, v: int) -> B: ...
__or__ = _no
def __ior__(self, v: int) -> None: ... # error: Signatures of "__ior__" and "__or__" are incompatible
reveal_type(__or__) # note: Revealed type is "def (self: _error.B, v: builtins.int) -> _error.B"
reveal_type(__ior__) # note: Revealed type is "def (_error.B, builtins.int)"
NOTE: the same is true for __and__, __xor__, __add__, __sub__, __mul__, __truediv__, __floordiv__. (I haven't tested others.
Your Environment
- Mypy version used: 0.931
- Python version used: python3.9
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 reproduire la différence signalée entre la définition de or dans la classe A et l’affectation de or depuis _no dans la classe B, en utilisant l’exemple Python 3.9 et le comportement de mypy 0.931. Suivez le chemin de vérification des types qui compare les signatures de ior et or, puis vérifiez le résultat avec les autres méthodes dunder arithmétiques mentionnées dans le rapport. Le travail est terminé lorsque les méthodes affectées compatibles ne produisent plus à tort l’erreur d’incompatibilité, tandis que les signatures réellement incompatibles la produisent toujours.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers, devtools
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 42/100