2016-02-05 3 views
0

У меня есть ряд условного вида:выражения в словаре отображения

if ':' in particle: 
    do something 
elif 'eq' in particle: 
    do something else 
elif 'lt' in particle: 
    do another thing 
elif 'le' in particle: 
    etc. 
elif 'gt' in particle: 
    etc., etc. 
elif 'ge' in particle: 
    etc., etc., etc. 
elif 'ne' in particle: 
    more etc. 

Я хочу, чтобы это реализовать с помощью словаря шаблона отображения, но у меня возникают проблемы с ключами.

Я попытался это:

def case_evaluator(particle): 
    switcher = { 
     ':' in particle: do something, 
     'eq' in particle: do something else, 
     'lt' in particle: do another thing, 
     ... 
    } 
    return switcher.get(particle, "nothing") 

Но я все не получаю "ничего". Как что-то ничего не дает?

Это кажется, что это должно быть просто, но увы ...

+0

не должны «аргумент» быть объявлен где-то? – phenxd

+0

Извините ... Я только что отредактировал это. –

ответ

2

Возможно, вам нужен словарь, который отображает символы в функции.

char_function_dict = { 
    ':': colon_function, 
    'eq': eq_function, 
    'lt': lt_function 
    # ...and so on... 
} 

Затем вы можете перебирать пары ключ-значение в этом словаре.

def apply_function(particle): 
    for char, function in char_function_dict.items(): 
     if char in particle: 
      function() 

Однако, обратите внимание, что эта структура не реально использовать что-либо конкретное в словарях и не сохраняет порядок, в котором символы проверяются. Возможно, было бы еще проще использовать список 2-элементных кортежей.

char_functions = [ 
    (':', colon_function), 
    ('eq', eq_function), 
    ('lt', lt_function) 
    # ...and so on... 
] 

def apply_function(particle): 
    for char, function in char_functions: 
     if char in particle: 
      function() 
      break # so successive functions are not run 

Настройка любой из этих структур, чтобы аргументы и/или ключевые аргументы, которые будут переданы функции легко:

def apply_function(particle, *args, **kwargs): 
    for char, function in char_functions: 
     if char in particle: 
      function(*args, **kwargs) 
      break 
+0

Ницца. Мне это нравится. Я просто нашел это, что более или менее эквивалентно вашему ответу: ... –

2

Вы находитесь на правильном пути. Это называется диспетчером функций. Он должен выглядеть следующим образом:

def case_evaluator(particle): 
    switcher = { 
     ':': do_something, 
     'eq': do_something_else, 
     'lt': do_another_thing, 
     ... 
    } 
    return switcher.get(particle, lambda: "nothing")() 

где do_something, и т.д., все функции, которые не принимают никаких аргументов. lambda x: "nothing" - это лямбда-функция, которая всегда возвращает «ничего» - это функция по умолчанию, которую следует вызывать, если particle не найден в switcher.keys().

+0

Извините, что уменьшите это. Если вы его отредактируете, я верну его снова. Ваше решение работает тоже. –