python的TypeVar推理在使用lru_cache装饰器时中断。例如,在应用mypy之后,下面的示例中,只有使用lru_cache的函数会导致错误,如下所示:
main.py:14: error: Incompatible types in assignment (expression has type "T", variable has type "int")
Found 1 error in 1 file (checked 1 source file)而pyright的编辑器支持也警告了同样的事情。这是lru_cache自身的局限性还是有一些好的解决办法?
from functools import lru_cache
from typing import TypeVar
T = TypeVar("T")
def working(foo: T) -> T:
return foo
@lru_cache(maxsize=None)
def not_working(foo: T) -> T:
return foo
a: int = working(1)
b: int = not_working(1)发布于 2022-08-28 09:57:06
以下是类型提示的相关部分
_T = TypeVar("_T")
class _lru_cache_wrapper(Generic[_T]):
__wrapped__: Callable[..., _T]
def __call__(self, *args: Hashable, **kwargs: Hashable) -> _T: ...
def lru_cache(
maxsize: int | None = ..., typed: bool = ...
) -> Callable[[Callable[..., _T]], _lru_cache_wrapper[_T]]: ...因此,在允许任何参数集的尝试中,它似乎失去了输入和输出类型之间的任何连接,因此无法将T细化为int。您可能必须在本地包装lru_cache以修复此问题。您可能会使用ParamSpec,但您可能会发现这方面的困难,请参见下面的说明。如果您只需要一小组函数类型(一元、二进制、三元),则可以对这些类型进行包装。
显然,他们确实与把这个修好与ParamSpec,但从粗略的阅读,它似乎打破了其他东西,所以他们倒回去。这个问题也对此进行了讨论。
https://stackoverflow.com/questions/73517571
复制相似问题