оператор switch не выполняется при вызове функции

#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:

Здесь есть несколько проблем.

  1. Ваш код действительно вызывает channel() , но он возвращает лямбду, которую вы никогда не используете (вызов)
  2. В вашем switcher dict ключи есть int , и вы передаете str их в качестве аргумента (т. Е. лямбда, возвращаемая в 1. всегда та, с Invalid Channel которой .
  3. поскольку в операторе if вы проверяете , что пользовательский ввод channelArr включен, обычно (т. Е. Если вы исправляете ключи switcher ) не должно быть необходимости использовать get() значение с резервным значением).
  4. На самом деле вам не нужна лямбда в 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 я ищу и получил объяснение, оно принимает аргумент, чтобы поместить его в список или кортеж.