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