2016-08-23 5 views
0

Пробую эту небольшую часть кода, которая может быть альтернативой коммутатору. Но я попал в Ошибка.Switch Alternative in python

def main(x): 

    x = x.split(' ') 
    return {'Function1' : Function1(x), 
      'Function2' : Function2(x), 
      }[x[0]] 


def Function1(x): 
    var1 = x[0] 
    var2 = x[1] 

def Function2(x): 
    print x[0] 

main("Function1 10") 

Теперь приведенный выше код работает нормально. Проблема в том, что если я передаю Function2 как ключ без каких-либо аргументов основной функции, она автоматически переходит в Function1 и выдает список ошибок вне диапазона.

main("Function2") 

Thanks in Advance.

+0

В 'Function2' вы не определили какой-либо переменной' x' но вы получаете доступ к своему 1-му элементу – mirosval

+0

@mirosval, он не входит в fun2. – taz

+1

Есть несколько различий между тем, что вы можете делать со словарями, в отличие от обычных операторов switch с других языков. Возможно, задайте вопрос в том, что вы пытаетесь сделать и как. Сопоставление значений с функциями может выполняться с помощью сопоставления (например, того, что вы делаете), без необходимости использования оператора switch. –

ответ

3

Ваш код не работает вообще. Вы всегда вызываете функции при определении dict. Вы должны сохранить вызываемый в dict и вызвать результат.

def main(x): 
    x = x.split(' ') 
    func = {'Function1' : Function1, 
      'Function2' : Function2, 
      }[x[0]] 
    return func(x[1]) 
+0

Если вы пишете, это правда, но это не будет работать для отсутствующих ключей (нет «по умолчанию»). Кроме того, нет никакого пассивного поведения (поэтому нельзя использовать, например, для duff-устройства), что также стоит упомянуть. –

+0

@ Daniel Но я не могу передать несколько мерцаний моей функции, используя этот код. – taz

+0

Поведение по умолчанию легко достигается с помощью get вместо индексации. например func.get (x [0], Function3) – Tim

0

Что вам действительно нужно сделать, это использовать строку if/elif/else утверждений:

if x == 1: 
    Function1() 
elif x == 2: 
    Function2() 
else: 
    Function3() 
+2

_should do_ немного жестко, используя сопоставление вместо большого количества ifs, является допустимым методом программирования, а сохранение вызываемых объектов в таком сопоставлении - [ничего не возмутительно в Python] (http://stackoverflow.com/questions/9205081/python-is- там-а-путь к магазину-а-функция-в-список или-словарь так, что-когда). –

+0

Зависит от того, сколько случаев у вас есть, и они должны быть динамичными. Для нескольких статических случаев это, безусловно, намного более читаемо. Теперь у ОП есть 2 случая, которые не требуют динамического расширения, и он не упоминает ни одного из этих требований, поэтому предположительно просто лучше, чем сложный. – mirosval

1

Блок кода

return {'Function1' : Function1(x), 
     'Function2' : Function2(x), 
     }[x[0]] 

оценивается сначала как

return {'Function1' : Function1(x), 
     'Function2' : Function2(x), 
     } 

Оценка этой будет актуальным позвоните как Function1, так и Function2.

Что вы хотите, чтобы получить ссылку на нужную функцию фактически не называя его, пока вы не знаете, что вы хотите позвонить:

return {'Function1' : Function1, 
     'Function2' : Function2, 
     }[x[0]](x)