Как вызвать произвольное количество функций внутри функции? - PullRequest
0 голосов
/ 25 мая 2020

Я хотел бы передать указанное количество функций в качестве аргументов самой внешней функции. Внутри средних функций я хотел бы вызвать произвольное количество функций. Итак, средняя функция - это группа для внутренних функций. На основании определенных критериев c группы функций могут вызываться или не вызываться.

В приведенном ниже примере самая внешняя функция принимает ровно 2 аргумента, но средняя функция должна принимать произвольное количество функций.

EG:

def al_func1():
    print('al 1')


def al_func2():
    print('al 2')


def ml_func1():
    print('ml 1')


def ml_func2():
    print('ml 2')


def function_to_connect(hostname: str, al, ml):
    print(f'Connecting to {hostname}')
    if 'al' in hostname:
        al
    elif 'ml' in hostname:
        ml


def call_al(*al_functs):
    al_functs


def call_ml(*ml_functs):
    ml_functs


function_to_connect('ipi-al', call_al(al_func1(), al_func2()), call_ml(
    ml_func1(), ml_func2()))

В основном это работает, но независимо от результата оператора «if» функции всегда выполняются, и порядок не соответствует моим ожиданиям.

Результат:

al 1
al 2
ml 1
ml 2
Connecting to ipi-al

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

Когда вы передаете функции, вы помещаете туда «()», который вызывает функцию.

Как это исправить:

  • Удалите «()» в конце входных данных, это запустит функцию
  • Добавить «()» в конец функций, это фактически вызовет функцию и запустит ее
0 голосов
/ 25 мая 2020

Добро пожаловать в Stack Overflow!

Вы были очень близки! Здесь вам необходимо изучить

  • Лямбда-функции
  • Передача функций без их вызова
  • Как перебирать упакованные аргументы (символ *)

Я исправил ваш код, думаю, он такой, как вы хотите

def al_func1():
    print('al 1')


def al_func2():
    print('al 2')


def ml_func1():
    print('ml 1')


def ml_func2():
    print('ml 2')


def function_to_connect(hostname: str, al, ml):
    """
    This is the description for the function.

    :param str hostname: This is decription for 'hostname'
    :param function al: This is description for 'al'
    :param function ml: This is description for 'ml'
    """
    print(f'Connecting to {hostname}')
    if 'al' in hostname:
        al()
    elif 'ml' in hostname:
        ml()


def call_al(*al_functs):
    for func in al_functs:
        func()


def call_ml(*ml_functs):
    for func in ml_functs:
        func()


function_to_connect('ipi-al', lambda: call_al(al_func1, al_func2), lambda: call_ml(ml_func1, ml_func2))
...