python / python/mypy

Signatures of "__ior__" and "__or__" are incompatible when assigning __or__ with compatible method

Ouverte
#11,941 1 commentaire 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug
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

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

Recevez les nouvelles issues par e-mail

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