首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由TypeVar装饰器破坏的lru_cache推理

由TypeVar装饰器破坏的lru_cache推理
EN

Stack Overflow用户
提问于 2022-08-28 09:40:42
回答 1查看 50关注 0票数 0

python的TypeVar推理在使用lru_cache装饰器时中断。例如,在应用mypy之后,下面的示例中,只有使用lru_cache的函数会导致错误,如下所示:

代码语言:javascript
复制
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自身的局限性还是有一些好的解决办法?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-28 09:57:06

以下是类型提示的相关部分

代码语言:javascript
复制
_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,但从粗略的阅读,它似乎打破了其他东西,所以他们倒回去这个问题也对此进行了讨论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73517571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档