Как исправить: оператор "Switch" в Python не распознает входную строку

Мне нужно проанализировать некоторые действия, данные клиентом. Действие представляет собой простую строку, содержащую слово action: "load", "start", "pause",....

Я родом из мира C, и я новичок в Python. Мне нужен оператор switch, и я сделал это с помощью функции switcher.get() (см. Код ниже).

Проблема в том, что этот переключатель не распознает только строку "load", остальные строки работают правильно (см. Пример вывода ниже).

Почему?

Чтобы правильно проанализировать проблему, я даю вам только случай переключения, потому что остальная часть кода работает, и это бесполезно для этой части. Я пытаюсь передать строку 'load' функции напрямую, но она попадает непосредственно в зону исключений "Команда не найдена"

switcher={
        'load': partial(load_wav,message_tocheck),
        'start': partial(start_wav,message_tocheck),
        'pause': partial(pause_wav,message_tocheck),
        'resume': partial(resume_wav,message_tocheck),
        'stop': partial(stop_wav,message_tocheck),
        'reset': partial(reset_ch,message_tocheck),
        'mqtt': partial(mqttrun),
        'help': partial(help),
        'zero':lambda:'lambda'
    }  
    try:
        func=switcher.get('load','INVALID')
        return func()
    except:
        print('-------- COMMAND NOT FOUND --------')

ВЫХОД:

  • нагрузка (НЕ РАБОТАЕТ):

-------- КОМАНДА НЕ НАЙДЕНА --------

  • Начните работу):

Пределы: A = 0, B = 8, C = 0, D = 8

Образец ожидания = 690

Светодиодная матрица на канале 0. Стимуляция работает...

  • помощь (РАБОТА):

---------------- Помогите ----------------

Возможные команды:

ВСТАВЬТЕ ВСЕ ВОЗМОЖНЫЕ ТЕМЫ, ЧТОБЫ ПОДПИСАТЬСЯ

---------------- Помогите ----------------

Как видите, единственная строка, которая не работает, это load. Проблема в том, что я не могу заменить слово "загрузить" другим.

1 ответ

Решение

Там нет никакого способа, которым switcher.get('load') генерирует исключение, поэтому это должен быть вызов функции ниже.

Попробуйте это вместо этого:

func = switcher.get('load')
if func is None:
    raise ValueError("Command not found")

func()  # at this point `func` is a valid member of `switcher`, but it still can raise exceptions

Почему код с try/except не работает:

try блок содержит призыв к func, который может поднимать исключение. Кроме того, вероятно, в какой-то момент словарь не содержит ключ, который вы ищете, поэтому get возвращает строку, которую вы в итоге вызываете, что невозможно, поэтому вы получаете исключение.

Если вы хотели бы использовать try/exceptдобавить else пункт:

try:
    func = switcher['load']
except KeyError:
    raise ValueError("Command not found")
else:
    # no exception was raised
    func()
Другие вопросы по тегам