Python3 Switch не работает, вернуть все дела - PullRequest
1 голос
/ 21 апреля 2019

Я новичок в python, я пытаюсь сделать реализацию switch-case в python, я уже узнал об этом, но он не работает. вернуть все это дело

if not (data.message is None):
    if data.message[0] == "/":
        command = data.message.split("/")
        if not (command[1] is None):
            switcher = {
                "location" : funcA(data.id),
                "carousel" : funcB(data.id, data.name),
                "button" : funcC(data.id),
                "card" : funcD(data.id, data.name)
            }
            return switcher.get(command[1], funcE())
        else:
            return funcE()
    else:
        return funcE() 

затем, я проверяю входную команду [1] с помощью '/ asd', она вернет все функции.

1 Ответ

1 голос
/ 21 апреля 2019

Как упомянул @snakecharmerb, в значениях вашего словаря вы должны быть именовать функции, не вызывающие их:

switcher = {
    "location" : funcA,
    "carousel" : funcB,
    "button" : funcC,
    "card" : funcD
}

И указать аргумент data.id в returnоператор, если ключ существует в словаре:

return switcher[command[1]](data.id) if command[1] in switcher else funcE()

Также, вы можете заменить if not (data.message is None) на if message и объединить его с data.message[0] == "/".

Как указано @Марк Бэйли, поскольку вы уже проверяете, находится ли command[1] в switcher, вы можете полностью удалить второй оператор if.

Всего:

if data.message and data.message[0] == "/":
    command = data.message.split("/")
    switcher = {
        "location" : funcA,
        "carousel" : funcB,
        "button" : funcC,
        "card" : funcD
    }
    return switcher[command[1]](data.id) if command[1] in switcher else funcE()
else:
    return funcE()

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

if data.message and data.message[0] == "/":
    command = data.message.split("/")
    switcher = {
        "location" : [funcA,[data.id,data.name]],
        "carousel" : [funcB,[data.id]],
        "button" : [funcC,[data.id,data.name]],
        "card" : [funcD,[data.id,data.name, data.time]]
    }
    return switcher[command[1]][0](*switcher[command[1]][1]) if command[1] in switcher else funcE()
else:
    return funcE()
...