Как исправить: оператор "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()