Wrong inference for `abs/__abs__` or function that calls a method on a generic type.
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
This was discussed in the typing forums.
Here mypy (latest version 1.17.1) infers the type of abs(value) incorrectly:
from typing import Self
class Real:
def __abs__(self) -> Self:
return self
def my_abs[T: Real](value: T):
reveal_type(abs(value)) # Real
reveal_type(value.__abs__()) # T
That is:
$ mypy z.py
z.py:8: note: Revealed type is "z.Real"
z.py:9: note: Revealed type is "T`-1"
Success: no issues found in 1 source file
Since abs just calls __abs__ they return the same type which should be inferred as T in both cases.
I show the simpler example above with a concrete Real type but what I actually want to do is have a Protocol for abs:
from typing import Self, Protocol
class HasAbs(Protocol):
def __abs__(self) -> Self:
return self
def my_abs[T: HasAbs](value: T) -> T:
return abs(value)
However mypy incorrectly rejects this because it infers the type of abs(value) incorrectly:
$ mypy z.py
z.py:8: error: Incompatible return value type (got "HasAbs", expected "T") [return-value]
Found 1 error in 1 file (checked 1 source file)
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
Comienza con los ejemplos de z.py en el issue y ejecuta mypy 1.17.1 para reproducir los tipos revelados diferentes y el valor de retorno rechazado. Rastrea cómo se infiere abs(value) frente a value.abs() y añade una prueba de regresión que muestre que un valor genérico restringido por HasAbs conserva el tipo T y pasa la comprobación de tipos.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- devtools
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100