Как исправить: оператор «Switch» в Python не распознает входную строку - PullRequest
0 голосов
/ 14 июня 2019

Мне нужно проанализировать некоторые действия, данные клиентом.Действие представляет собой простую строку, содержащую слово 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 --------')

ВЫХОД:

  • load (DOESN 'T WORK):

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

  • start (WORK):

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

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

Матрица светодиода на канале 0. Запуск стимуляции ...

  • help (РАБОТА):

---------------- help ----------------

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

ВСТАВИТЬ ВСЕ ВОЗМОЖНЫЕ ТЕМЫ В ПОДПИСКУ

----------------help ----------------

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

1 Ответ

3 голосов
/ 14 июня 2019

Там нет никакого способа , чтобы 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()
...