如何将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))
代码说明
- 外层
partialize函数:负责接收你想要预设的位置参数*args和关键字参数**kwargs,返回一个用于接收目标函数的装饰器。 - 内层
decorator函数:接收被装饰的函数func,调用functools.partial将函数与预设参数绑定,生成偏函数对象。 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
相关产品推荐
相关产品推荐

