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

如何将functools.partial转换为支持先传参的装饰器?

实现先接收参数再绑定函数的partialize装饰器

要实现你需要的partialize装饰器,核心是利用带参数的装饰器本质是装饰器工厂这一特性:外层函数先接收预设的参数,返回一个真正的装饰器函数,这个内层函数再接收被装饰的目标函数,最后用functools.partial完成参数绑定。

完整实现代码

from functools import partial, wraps
from inspect import signature

def partialize(*args, **kwargs):
    # 外层函数:接收预设参数,返回装饰器
    def decorator(func):
        # 用partial绑定函数与预设参数
        partial_func = partial(func, *args, **kwargs)
        # 保留原函数元信息(可选但推荐)
        wraps(func)(partial_func)
        return partial_func
    return decorator

# 使用装饰器
@partialize(1, 2)
def funky_function(x1, x2, x3, x4, x5, /):
    return ", ".join(" ".join(str(x).split()) for x in [x1, x2, x3, x4, x5])

# 测试调用
result = funky_function(3, 4, 5)
print("return value from `funky_function(3, 4, 5)` is:", result)
print("signature of `funky_function` is:", signature(funky_function))

代码说明

  1. 外层partialize函数:负责接收你想要预设的位置参数*args和关键字参数**kwargs,返回一个用于接收目标函数的装饰器。
  2. 内层decorator函数:接收被装饰的函数func,调用functools.partial将函数与预设参数绑定,生成偏函数对象。
  3. wraps装饰器:可选但推荐使用,它会把原函数的名称、文档字符串等元信息复制到偏函数上,避免装饰器导致的函数元信息丢失问题。

运行输出

return value from `funky_function(3, 4, 5)` is: 1, 2, 3, 4, 5
signature of `funky_function` is: (x3, x4, x5, /)

这个实现完全符合你需要的装饰器语法,同时保留了functools.partial的所有功能,支持位置参数和关键字参数的预设。

内容的提问来源于stack exchange,提问作者Toothpick Anemone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:10:45