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

如何在柯里化函数中保留被柯里化函数的元数据(如__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:03:31