Cannot determine type of "__gt__" error on decorated __lt__ method where decorator is an assigned alias of another decorator
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Okay, this one has me stumped.
I am getting a Cannot determine type of "__gt__" error on my definition of __lt__. Yes. You read that right. The error complains of __gt__, but happens on def __lt__ …. If I swap the declaration order (such that def __gt__ … appears before def __lt__ …), then I get the error Cannot determine type of "__lt__" error on my definition of __gt__, so at least it's…symmetrical.
The problem only emerges when I use an alias for a decorator created by assignment.
To Reproduce
# test_cast.py
from operator import __gt__, __lt__
from typing import Callable, TypeVar, Union
_T = TypeVar("_T")
def identity(__: _T) -> _T:
return __
maybe_not_available_decorator = identity # <-- problematic decorator alias
# try:
# from spicy import spicy_decorator as maybe_not_available_decorator
# except ImportError:
# pass
class Spam:
def __init__(self, value: int):
super().__init__()
self._value = value
@identity # <- function
def __lt__(self, other: Union[int, "Spam"]) -> bool: # <-- this is fine
if isinstance(other, Spam):
return __lt__(self._value, other._value)
else:
return NotImplemented
@identity # <- function
def __gt__(self, other: Union[int, "Spam"]) -> bool: # <-- so is this
if isinstance(other, Spam):
return __gt__(self._value, other._value)
else:
return NotImplemented
class Ham:
def __init__(self, value: int):
super().__init__()
self._value = value
@maybe_not_available_decorator # <- alias
def __lt__(self, other: Union[int, "Ham"]) -> bool: # <-- Cannot determine type of "__gt__"
if isinstance(other, Ham):
return __lt__(self._value, other._value)
else:
return NotImplemented
@maybe_not_available_decorator # <- alias
def __gt__(self, other: Union[int, "Ham"]) -> bool: # <-- this is fine for some reason
if isinstance(other, Ham):
return __gt__(self._value, other._value)
else:
return NotImplemented
Your Environment
% mypy --config-file=/dev/null test_case.py
/dev/null: No [mypy] section in config file
test_case.py:42: error: Cannot determine type of "__gt__"
Found 1 error in 1 file (checked 1 source file)
% mypy --version
mypy 0.910
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 dem Reproducer in test_case.py und führe mypy --config-file=/dev/null aus, um den gemeldeten Fehler für die dekorierten Ham-Methoden zu bestätigen. Vergleiche den identity-Decorator mit seinem zugewiesenen Alias und verfolge anschließend mypys Analyse von Decorators und speziellen Methoden. Als abgeschlossen gilt die Aufgabe, wenn die Alias-Form keinen unbegründeten Cannot determine type-Fehler erzeugt und das bestehende Verhalten weiterhin intakt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100