如何将函数列表组合成可调用对象

How to compose a list of functions to a callable

我有一个简单的来源。

def h(x):
    return x + 1

def m(x):
    return x + 2

def n(x):
    return x * 10

def function_aggregator(fun_list, num):
    return_fun = None
    for fun in fun_list[::-1]:
        if return_fun:
            return_fun = fun(return_fun)
        else:
            return_fun = fun(num)
    return return_fun

if __name__ == "__main__":
    lst = [h, m, n]
    y = function_aggregator(lst, 4)
    print(y)

有什么方法可以让 function_aggregator 方法只接收列表和 return 一个可调用对象,这将与 h(m(n(<any_number>))

相同

可以使用闭包来完成:

def function_aggregator(*func_list):
    def aggregate(num):
        for func in reversed(func_list):
            num = func(num)
        return num
    return aggregate

if __name__ == "__main__":
    myfunc = function_aggregator(h, m, n)
    print(myfunc(4))

备注

  • function_aggregator 现在接受任意数量的函数
  • 里面定义了另一个函数,aggregate,就是你说的callable
  • function_aggregator return 是 可调用的 ,又名 aggregate 给调用者
  • 然后调用者给它起一个名字,myfunc在这个例子中
  • 从那时起,我们可以将 myfunc 视为一个接受 1 个参数和 return 某些参数的函数

前面的答案很接近。确切答案是:

def function_aggregator(fun_list):
    def wrapper(arg):
        for fun in reversed(fun_list):
            arg = fun(arg)
        return arg
    return wrapper


if __name__ == "__main__":
    lst = [g, f, n, m, h]
    p = function_aggregator(lst)
    x = 3
    print("p(x): {}".format(p(x)))

感谢Zero Piraeus commet