Signatures of "__ior__" and "__or__" are incompatible when assigning __or__ with compatible method
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza reproduciendo la diferencia indicada entre definir or en la clase A y asignar or desde _no en la clase B, usando el ejemplo de Python 3.9 y el comportamiento de mypy 0.931. Sigue la ruta de comprobación de tipos que compara las firmas de ior y or, y después verifica el resultado con los otros métodos dunder aritméticos enumerados en el informe. Se considera terminado cuando los métodos asignados compatibles ya no producen por error el error de incompatibilidad, mientras que las firmas realmente incompatibles sí lo siguen produciendo.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers, devtools
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 42/100