Python mypy注释装饰程序调用__

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

我试图对实现为类的装饰器进行注释,但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():
    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添加了对的支持,这可能成为可能,这通常会为键入与装饰器相关的代码提供更好的支持