Python 类函数装饰器的正确类型

Python 类函数装饰器的正确类型,python,mypy,pyright,Python,Mypy,Pyright,在函数decorator之前键入print\u的正确方法是什么 包装函数具有正确的类型,但我不能在不起作用的类上使用decorator 多谢各位 def print_之前(func): def func_包装器(自身,*参数): self.print_hi() 返回函数(self,*args) 返回函数包装器 类印刷品: def打印_hi(自身): 打印(“hi”) @打印前 def add_nums(self,a:int,b:int)->int: 返回a+b pt=PrintThings()

在函数decorator之前键入
print\u的正确方法是什么
包装函数具有正确的类型,但我不能在不起作用的类上使用decorator

多谢各位

def print_之前(func):
def func_包装器(自身,*参数):
self.print_hi()
返回函数(self,*args)
返回函数包装器
类印刷品:
def打印_hi(自身):
打印(“hi”)
@打印前
def add_nums(self,a:int,b:int)->int:
返回a+b
pt=PrintThings()
第5、4部分增加数值
班级不应该工作:
@打印前
def add_nums(self,a:int,b:int)->int:
返回a+b
snw=不应工作()
snw.添加nums(4,5)

我会研究输入函数。或者,对于类/对象。

装饰器有一个非常通用的类型。关于包装器,您只知道它至少接受一个未知类型的参数,并返回未知类型的参数。至于装饰器本身,您只知道它返回与参数类型相同的内容

事实上,我们还知道一件事。无论
self
的类型是什么,它都必须具有
print\u hi
方法。我们可以使用
协议
来表示这一点

我们还引入了一个类型变量
T
,每次在
之前的
print\u签名中使用它时,它都表示相同的类(或其子类)

from typing import Any, Tuple, Protocol, TypeVar

class PrintsHi(Protocol):
    def print_hi(self):
        pass


T = TypeVar('T', bound=PrintsHi)


def print_before(func: Callable[[T, Tuple[Any,...]], Any]) -> Callable[[T, Tuple[Any,...]], Any]:
    def func_wrapper(self: T, *args: Tuple[Any,...]):
        self.print_hi()
        return func(self, *args)
    return func_wrapper
输入import Any、Tuple、Protocol、TypeVar
打印类(协议):
def打印_hi(自身):
通过
T=TypeVar('T',bound=PrintsHi)
def print_before(func:Callable[[T,Tuple[Any,…]],Any])->Callable[[T,Tuple[Any,…]],Any]:
def func_包装(self:T,*args:Tuple[Any,…]):
self.print_hi()
返回函数(self,*args)

return func_wrapper
但我也知道self不能是任何
,因为它需要定义一个函数
print_hi
,修复了这个问题,但它仍然不太正确:我们还可以假设返回值涉及参数使用的同一个类(尽管可能是一个子类)。我认为它现在已经修复了,但是我现在不能测试。谢谢你的帮助!最新的迭代现在不允许两种用法:类型为“(self:PrintThings,a:int,b:int)->int”的D参数不能分配给类型为“(p0:T,p1:Tuple[Any,…])->的参数“func”。。。“Tuple[Any,…]”与“int”不兼容,函数接受的位置参数太少;我认为这是解决我的问题所需要的:python 3.10在一年内才会推出