将装饰器实现为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
相关产品推荐
相关产品推荐

