You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将装饰器实现为classmethod时类型提示丢失的问题咨询

将装饰器实现为classmethod时类型提示丢失的问题咨询

我最近碰到一个Python类型提示相关的问题,当把装饰器实现成类的classmethod时,单独查看这个方法的类型时Pyright能正确识别泛型关联,但把它当作装饰器使用时,类型关系就完全丢失了,想请教大家怎么解决这个问题。

先给大家展示我的代码:

from typing import Any, Callable, Coroutine

class Cache[**P, R]:
    @classmethod
    def decorate(cls, **params):
        def decorator(f: Callable[P, Coroutine[Any, Any, R]]) -> Callable[P, Coroutine[Any, Any, R]]:
            return f # 在实际业务场景中,这里会实例化一个Cache对象
        return decorator

@Cache.decorate()
async def some_function(i: int) -> int:
    return i + 1

cached_function = Cache.decorate()(some_function)

两种场景下的Pyright类型检查结果

  • 直接查看Cache.decorate方法本身(未作为装饰器使用时)
    Pyright返回的类型信息是正确的,能识别出泛型参数P(函数参数类型)和R(函数返回类型)的关联:
(method) def decorate(
    cls: type[Self@Cache[P@Cache, R@Cache]],
    **params: Unknown
) -> ((f: ((**P@Cache) -> (Coroutine[Any, Any, R@Cache])) -> ((**P@Cache) -> Coroutine[Any, Any, R@Cache]))
  • 作为装饰器使用时查看Cache.decorate的类型
    这时候Pyright返回的类型就完全丢失了泛型关联,所有具体类型都变成了模糊的Unknown和...:
(method) def decorate(**params: Unknown) -> ((f: ((...) -> Coroutine[Any, Any, Unknown])) -> ((...) -> Coroutine[Any, Any, Unknown]))

有没有朋友遇到过类似的情况?或者知道怎么让Pyright在装饰器使用场景下也能正确识别这些泛型类型呢?

备注:内容来源于stack exchange,提问作者Charles Duffy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:09:38