Python mypy注释装饰程序调用__
我试图对实现为类的装饰器进行注释,但mypy似乎要么丢失了注释,要么丢失了类型并认为它是Any。 我想说明的是:Python mypy注释装饰程序调用__,python,mypy,python-typing,Python,Mypy,Python Typing,我试图对实现为类的装饰器进行注释,但mypy似乎要么丢失了注释,要么丢失了类型并认为它是Any。 我想说明的是: class my_decorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): return self.func(*args, **kwargs) @my_decorator def func(): retu
class my_decorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
@my_decorator
def func():
return 2
如何对此进行注释,以便在装饰后将func检测为返回int?
我意识到上面看起来很简单,我可以将我的_decorator转换为函数,但实际上它是子类化的,具有更专门的选项。您需要将我的_decorator设置为a,并执行以下操作:
from typing import Any, Callable, Generic, TypeVar
T = TypeVar('T')
class my_decorator(Generic[T]):
def __init__(self, func: Callable[..., T]) -> None:
self.func = func
def __call__(self, *args: Any, **kwargs: Any) -> T:
return self.func(*args, **kwargs)
@my_decorator
def func() -> int:
return 2
也就是说,使用TypeVar捕获函数的返回类型,其作用域为my_decorator
类。这确保了当我们在分析\uuuuu call\uuuu
的任何调用时,绑定到TypeVar的值“可用”
不幸的是,无法确保\uuuuu call\uuu
的参数与func()
的参数匹配。因此,如果您尝试执行类似于func(1,2,3)
的操作,mypy将不会报告错误
一旦mypy添加了对的支持,这可能成为可能,这通常会为键入与装饰器相关的代码提供更好的支持