`functools.lru_cache` wrapped function with TypeVar has wrong return type.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 5.1k
- Forks
- 2.1k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 82
Beschreibung
Hi,
I think there is a problem when using functools.lru_cache (and functools.cache). When the decorated function uses a TypeVar for typing arguments and return type, the wrapped function returend by functools.lru_cache has wrong (or unresolved) types.
This is not the case when replacing the TypeVar with an explicit type. See the mwe below. Thx.
import functools
from typing import TypeVar
_T = TypeVar("_T")
def my_func(elem: _T) -> list[_T]:
return [elem]
my_func_cached = functools.lru_cache(my_func)
a = my_func("a")
reveal_type(a) # Revealed type is "builtins.list[builtins.str*]"
a_c = my_func_cached("a")
# ERROR: this should be "builtins.list*[builtins.str]"
reveal_type(a_c) # Revealed type is "builtins.list*[_T`-1]"
# this works
def my_func_str(elem: str) -> list[str]:
return [elem]
my_func_str_cached = functools.lru_cache(my_func_str)
a_str = my_func_str("a")
reveal_type(a_str) # Revealed type is "builtins.list[builtins.str]"
a_str_c = my_func_str_cached("a")
reveal_type(a_str_c) # Revealed type is "builtins.list*[builtins.str]"
Running:
Python 3.10.1
mypy 0.931
Linux 5.16.0-arch1-1
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
Reproduziere das Problem mit dem bereitgestellten Minimalbeispiel unter Verwendung von mypy 0.931 und untersuche anschließend die typeshed-Definitionen für functools.lru_cache und functools.cache. Die Arbeit ist abgeschlossen, wenn die zwischengespeicherte generische Funktion list[str] statt eines nicht aufgelösten TypeVar anzeigt, während das explizite str-Beispiel weiterhin funktioniert.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- tooling
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100