2010-07-26 2 views
0

я реализовал функцию:«случай последовательность» в Python реализован с словарями

 
def postback(i,user,tval): 
    """functie ce posteaza raspunsul bazei de date;stringul din mesaj tb sa fie mai mic de 140 de caractere""" 
    result = { 
     1:api.PostDirectMessage(user,'Trebuie sa-mi spui si marca pe care o cauti'), 
     2:postmarket(user,tval), 
     3:api.PostDirectMessage(user,'Imi pare rau, dar nu stiu unde poti gasi aceste tipuri de smantana: %s' % tval)} 
    return result.get(i) 

, но он не работает в качестве примера альтернативы (от C++) она выполняет все 3 случая, независимо от того, В я стараюсь .. .i'm the begginer, так что может быть другая ошибка, поэтому, пожалуйста, помогите! ps пожалуйста, не говорите мне, что если ... еще .. это единственная альтернатива, потому что я знаю, что это может работать

+3

Почему бы не использовать 'if i == 1: ...; elif i == 2: ...; elif i == 3: ... '? Что случилось с 'if'? –

+0

он слишком стар; и разрушает красоту кода, на мой взгляд – decebal

+0

Если ваш код не работает, какая у него «красота»? –

ответ

1

Он выполняет все три случая, потому что вы определяете result Dict таким образом! Вы называете все три функции и назначить их на клавиши 1, 2, 3.

То, что вы должны вместо этого что-то вроде этого:

functions = { 
    1: lambda: api.PostDirectMessage(user,'Trebuie sa-mi spui si marca pe care o cauti'), 
    2: lambda: postmarket(user,tval), 
    3: lambda: api.PostDirectMessage(user,'Imi pare rau, dar nu stiu unde poti gasi aceste tipuri de smantana: %s' % tval)} 
func = functions.get(i) 
if func: 
    return func() 
else: 
    raise ValueError("Bad index: %d!" % i) 

Здесь я определяю небольшие функции оболочки и сохранить их в Словаре вместо , Затем вы выбираете нужную функцию и вызываете эту функцию.

+0

Вы даже можете реорганизовать вызов функции на 'return functions.get (i, lambda: повысить значение ValueError (« Плохой индекс:% d! »% I))()', чтобы избежать следующей ветви. – Rudi

+0

Руди: Да, это тоже сработает. Тем не менее, я предпочитаю явно выражать if-statement. –

2

Если вы абсолютно необходимо использовать Dict, использовать Dict функций:

result = { 
    1: lambda: api.PostDirectMessage(...), 
    2: lambda: postmarket(...), 
    ... 
} 
return result[i]() 

Ключевое слово lambda определяет анонимную встроенную функцию, и они вызываются только в последней строке.

1

Выражения значения в dict будут вычисляться при компиляции. Если вы хотите, чтобы эти вещи были выполнены, вы могли бы обернуть их в лямбда.

def postback(i,user,tval): 
    result = { 
     1: lambda: api.PostDirectMessage(user,'Trebuie sa-mi spui si marca pe care o cauti'), 
     2: lambda: postmarket(user,tval), 
     3: lambda: api.PostDirectMessage(user,'Imi pare rau, dar nu stiu unde poti gasi aceste tipuri de smantana: %s' % tval)} 
    return result.get(i) 
Смежные вопросы