如何创建不修改输入函数签名的可复用装饰器类型?
解决装饰器类型定义的mypy报错问题
你的问题核心是没有给自定义的Decorator类型声明泛型参数,导致mypy在严格模式下无法推断类型参数。下面是正确的实现方式:
步骤1:定义泛型变量
首先用TypeVar声明一个代表任意可调用函数的泛型变量,绑定到Callable确保它只能是函数类型:
from typing import Callable, TypeVar # 定义泛型变量,代表任意签名的可调用函数 Func = TypeVar("Func", bound=Callable)
步骤2:定义泛型的Decorator类型
把Decorator定义为接收Func类型函数并返回同类型函数的泛型可调用类型:
# 泛型类型:接收任意签名的函数,返回相同签名的函数 Decorator = Callable[[Func], Func]
步骤3:使用Decorator类型标注装饰器
现在可以用这个类型来标注你的装饰器,mypy会自动推断具体的函数签名:
def my_decorator(func: Func) -> Func: def wrapper(*args, **kwargs): print("执行装饰逻辑") return func(*args, **kwargs) return wrapper # 用Decorator类型标注装饰器变量 decorator_instance: Decorator = my_decorator # 使用装饰器 @decorator_instance def add(a: int, b: int) -> int: return a + b
为什么原来的写法报错?
你之前直接提取Callable[[Func], Func]为Decorator时,Func没有被声明为泛型变量,mypy会把它当成一个未定义的类型参数,在严格模式下就会抛出"Missing type parameters for generic type"错误。通过显式声明TypeVar并绑定到Callable,mypy就能正确识别这是一个泛型类型,自动推断具体的函数签名。
运行mypy --strict检查上述代码,不会再出现报错。
内容的提问来源于stack exchange,提问作者tomerm98
相关产品推荐
相关产品推荐

