python / python/mypy

Wrong inference for `abs/__abs__` or function that calls a method on a generic type.

Offen
#19,609 0 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-type-variables
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

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Ö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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.