Как составить список функций для вызова

У меня есть простой источник.

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 метод получить только список и вернуть вызываемый будет таким же, как h(m(n(<any_number>))

2 ответа

Решение

Предыдущий ответ довольно близок. Точный ответ:

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

Это можно сделать с помощью замыкания:

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, это тот звоночек, о котором ты говоришь.
  • function_aggregator возвращает вызываемый, AKA aggregate звонящему
  • Звонящий затем дать ему имя, myfunc в этом случае
  • С тех пор мы можем лечить myfunc как функция, которая принимает 1 аргумент и возвращает что-то
Другие вопросы по тегам