Предотвратить цепочку if, elif, else (проверка ввода) - PullRequest
0 голосов
/ 17 января 2020

Если я объявляю эти функции:

def f1(someval):
    print(someval)

def f2(someval, someval2):
    print(someval, someval2)

И если у меня есть словарь, который содержит функции в качестве значений:

input_dict = {"func1": f1, "func2": f2}

И я хочу проверить, если ввод от пользователя соответствует ключу в ditionary 'input_dict':

shell_input = 'shell~: '
for key,val in input_dict:
    if key == shell_input:
        input_dict[val](params)

Как я могу определить, сколько параметров функции существует для каждой вызываемой функции и передать им значения, возможно ли это вообще (без объявления глобальных переменных) ?

Я пытаюсь избежать использования цепочек if, elif, else logi c в моем коде, например:

if shell_input == "func1":
    f1(param)
elif shell_input == "func2":
    f2(param1, param2)
#etc...

или более эффективно использовать цепочки if, elif, еще логи c при проверке ввода?

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Я не совсем уверен, что вы пытаетесь выполнить sh .. Если значение не зависит от пользовательского ввода, вы можете использовать их в качестве параметров по умолчанию и вызвать вашу функцию.

def f1(someval=default_value):
    print(someval)

def f2(someval=default_value_1, someval2=default_value_2):
    print(someval, someval2)

if shell_input == "func1":
    f1()

elif shell_input == "func2":
    f2()

Если проблема в количестве аргументов, которые вы можете использовать для распаковки. Аргументы будут итерируемыми, по которым вы могли бы повторяться. Это также можно использовать как диктовку.

def f1(*args):
    for arg in args:
         do 


def f2(**args):
    args1 = args["my_args"]
    args2 = args["my_other_args"]
# ex:
f2(my_args="blue", my_other_args="grey")
0 голосов
/ 17 января 2020

Используйте это:

input_dict = {"func1": f1, "func2": f2}

target = input_dict.get(shell_input)
if target:
    target(*params)

input_dict.get (shell_input) вернет None, если shell_input не соответствует ни одному из ключей input_dict.

Для требования к параметрам, я ' d предложил бы рефакторинг ваших функций следующим образом:

def f1(*args):
    print(args)

def f2(*args):
    print(args)

Таким образом, обе функции будут иметь одинаковую сигнатуру, и цель (* params) может быть использована для передачи аргументов (здесь используется расширение кортежа).

В качестве более полного примера:

input_dict = {'func1': (f1, (param,)), 'func2': (f2, (param, param2))}

values = input_dict.get(shell_input)
if values:
    target_func, params = values  # tuples expansion again
    target_func(*params)

Примечание. Каждый элемент input_dict содержит кортеж с функцией и параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...