#python #python-3.x
Вопрос:
Я пытаюсь получить ввод от пользователей, который будет использоваться в созданном мной вызове функции channel
. В start
функции, которую я вызвал, функция channel
, однако, не выполняет вызванную функцию и завершает код там напечатанным выбранным каналом.
# global vars channelArr = ['1','2'] # func channel 1 def getChOne(): print('Do something with channel 1') # func channel 2 def getChTwo(): print('Do something with channel 2') # func channel def channel(arg): switcher = { 1: lambda: getChOne(), 2: lambda: getChTwo(), } return switcher.get(arg, lambda: "Invalid Channel") # func start def start(): # get input print('n') inputChannel = input('Channel 1 to 2: ') # check input if (inputChannel.strip() in channelArr): print('Selected Channel:', inputChannel.strip()) channel(inputChannel.strip()) else: exit() # init app if (__name__ == '__main__'): # call func start start()
Комментарии:
1.
return switcher.get(arg, lambda: "Invalid Channel")
—gt;return switcher.get(int(arg), lambda: "Invalid Channel")
2. @balderman только что заметил, что my channelArr-это массив из нескольких строк, также измененных
return switcher.get(str(arg), lambda: "Invalid channel")
, и переключатель obj должен иметь ключ строки вместо int. По-прежнему не выполняется предусмотренная функция лямбда.
Ответ №1:
Здесь есть несколько проблем.
- Ваш код действительно вызывает
channel()
, но он возвращает лямбду, которую вы никогда не используете (вызов) - В вашем
switcher
dict ключи естьint
, и вы передаетеstr
их в качестве аргумента (т. Е. лямбда, возвращаемая в 1. всегда та, сInvalid Channel
которой . - поскольку в операторе if вы проверяете , что пользовательский ввод
channelArr
включен, обычно (т. Е. Если вы исправляете ключиswitcher
) не должно быть необходимости использоватьget()
значение с резервным значением). - На самом деле вам не нужна лямбда в
swithcher
# func channel 1 def getChOne(): print('Do something with channel 1') # func channel 2 def getChTwo(): print('Do something with channel 2') # func channel def channel(arg): switcher = { '1': getChOne, '2': getChTwo, } return switcher.get(arg, lambda: print("Invalid Channel")) # func start def start(): inputChannel = input('Channel 1 to 2: ').strip() print('Selected Channel:', inputChannel) channel(inputChannel)() # call the function if (__name__ == '__main__'): # call func start start()
Ответ №2:
Существует более простой способ сделать оператор switch.
Сначала определите функцию переключателя:
def switch(v): yield lambda *c: v in c
Затем используйте его как одинарную итерацию для цикла, где переменной цикла является функция case() :
inputChannel = input('Channel 1 to 2: ').strip() print('Selected Channel:', inputChannel) for case in switch(inputChannel): if case('1'): print('Do something with channel 1') break if case('2'): print('Do something with channel 2') break else: print('Invalid Channel')
Комментарии:
1. Спасибо за предложенный вами ответ, однако могу ли я узнать объяснение *c ?
2. nvm я ищу и получил объяснение, оно принимает аргумент, чтобы поместить его в список или кортеж.