如何解决Python mypy注释装饰器__call__
我正在尝试注释作为类实现的装饰器,但是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? 我意识到上面的内容看起来很简单,可以将my_decorator转换为函数,但实际上,它被子类化以具有更多专用选项。
解决方法
您需要将my_decorator
设为generic class,并执行以下操作:
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
类。这样,当我们在分析__call__
的任何调用时尝试使用它时,可以确保绑定到TypeVar的值是“可用的”。
不幸的是,无法确保__call__
的参数将与func()
的参数匹配。因此,如果您尝试执行类似func(1,2,3)
的操作,mypy将不会报告错误。
一旦mypy添加了对PEP 612的支持,从而为键入与装饰器相关的代码提供了更好的支持,这可能成为可能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。