You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建不修改输入函数签名的可复用装饰器类型?

解决装饰器类型定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:35:32