如何在柯里化函数中保留被柯里化函数的元数据(如__name__)?
如何让柯里化后的函数保留原函数的
__name__属性? 我编写了如下curry_explicit函数用于实现柯里化:
def curry_explicit(function, arity): """ Turning a function from several parameters into a function from one parameter that returns a function from the other parameters: function(a,b) --> function(a)(b) """ if arity == 0: return function def get_args(args): if len(args) == arity: return function(*args) def curry(x): return get_args([*args, x]) return curry return get_args([]) user_function = max curried_function = curry_explicit(user_function, 3) print(curried_function.__name__)
执行后输出:
curry
我需要让curried_function的__name__与被柯里化的函数名称一致,即输出:
max
请问是否可以使用functools.wraps实现?具体该如何操作?
可以用functools.wraps实现,核心是用它装饰生成的柯里化内层函数,将原函数的元数据(包括__name__)复制到装饰后的函数上。
修改后的代码如下:
import functools def curry_explicit(function, arity): """ 将多参数函数转换为单参数函数,返回接收剩余参数的函数: function(a,b) --> function(a)(b) """ if arity == 0: return function def get_args(args): if len(args) == arity: return function(*args) @functools.wraps(function) # 用原函数的元数据装饰curry函数 def curry(x): return get_args([*args, x]) return curry return get_args([]) user_function = max curried_function = curry_explicit(user_function, 3) print(curried_function.__name__) # 输出: max
关键修改说明:
- 首先导入
functools模块; - 在生成的
curry函数上方添加@functools.wraps(function)装饰器,它会把原函数(这里是max)的__name__、__doc__等属性复制到curry函数上; - 因为每次调用柯里化函数时返回的都是被装饰后的
curry函数,所以最终的curried_function的__name__会和原函数一致。
这样修改后,执行代码就会输出max,满足需求。
内容的提问来源于stack exchange,提问作者Danil Totjmyanin
相关产品推荐
相关产品推荐

