Wrong inference for `abs/__abs__` or function that calls a method on a generic type.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
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)
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit den z.py-Beispielen im Issue und führe mypy 1.17.1 aus, um die unterschiedlichen angezeigten Typen und den abgelehnten Rückgabewert zu reproduzieren. Verfolge, wie abs(value) im Vergleich zu value.abs() inferiert wird, und füge einen Regressionstest hinzu, der zeigt, dass ein generischer, durch HasAbs eingeschränkter Wert den Typ T beibehält und die Typprüfung besteht.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 45/100