`functools.lru_cache` wrapped function with TypeVar has wrong return type.
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 5.1k
- Forks
- 2.1k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 82
Description
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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the issue with the provided minimal example using mypy 0.931, then inspect the typeshed definitions for functools.lru_cache and functools.cache. The work is done when the cached generic function reveals list[str] rather than an unresolved TypeVar, while the explicit str example continues to work.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100