У меня есть алгоритм, который работает следующим образом (в псевдокоде):

def func_1(x):  
    apply processing 1 to x 
    return x
def func_2(x):
    apply processing 2 to  x
    return x
def func_3(x):
    apply processing 3 to  x
    return x

Я хотел бы написать функцию func_all_processing(data, execution_order), которая применяет все эти функции к некоторым входным данным в определенном порядке и выводит обработанные данные, скажем:

func_all_processing(data, [1,2,3])

Сделал бы:

processed_data = func_1(data)
processed_data = func_2(processed_data)
processed_data = func_3(processed_data)
return processed_data

В то время как

func_all_processing(data, [3,1,2])

Сделал бы:

processed_data = func_3(data)
processed_data = func_1(processed_data)
processed_data = func_2(processed_data)
return processed_data

Как правильно это сделать?

0
Vincent Clerc 19 Янв 2022 в 19:59
Одним из способов было бы передать функции в том порядке, в котором вы хотите, функции более высокого порядка, которая выполняет их в том порядке, в котором она их получает. Это вместо отправки флагов или отдельных приказов.
 – 
user1984
19 Янв 2022 в 20:02

3 ответа

Поместите функции в список и передайте этот список в func_all_processing(), который перебирает их.

def func_all_processing(data, funcs):
    for f in funcs:
        data = f(data)
    return data

print(func_all_processing(data, [func_1, func_2, func_3]))

И если вы хотите протестировать все разные порядки, используйте itertools.permutations() для циклического перебора различных перестановок.

1
Barmar 19 Янв 2022 в 20:03

Вы могли бы сделать:

def process_all(x,process_order:list):
    data = x
    for process in process_order:
        processed_date = globals()["func_{}".format(process.__str__())](data)
        data = processed_date
    return processed_date
0
XxJames07- 19 Янв 2022 в 20:07

Как указано @Bamar, я бы использовал список функций и инкапсулировал функции в функцию func_all_processing следующим образом:

def func_all_processing(data: [int, float], order: list) -> object:
    def func_1(x):  
        apply processing 1 to x 
        return x
    def func_2(x):
        apply processing 2 to  x
        return x
    def func_3(x):
        apply processing 3 to  x
        return x
    
    func_list = [func_1, func_2, func_2]
    rslt = data
    for i in order:
        rslt = func_list[i](rslt)
    return rslt    
0
itprorh66 19 Янв 2022 в 20:10