2013-11-17 6 views
1

Например, скажем, у меня есть куча операторов присваивания, как это:Использование строки в качестве оператора?

if operator == '==': 
    if a == b: 
     c += 5 
elif operator == '>': 
    if a > b: 
     c += 5 
elif operator == '<': 
    if a < b: 
     c += 5 

Условный вложенными, если заявления и задания, которые я дал только примеры, но в программе я пишу, они очень долго. Просто небольшое изменение присутствует, когда операторы отличаются, поэтому я не хочу повторять один и тот же длинный фрагмент кода снова и снова только для всех этих условий. Слишком много условий, и код будет повторяться много раз. Также есть ли «быстрый» способ сделать это? Могу ли я определить строку как оператор? Или какие-то лучшие способы?

ответ

6

Как насчет:

from operator import * 

str_ops = {'<':lt,'>':gt,'==':eq} # etc 
op = str_ops.get(my_operator) #where my_operator was previously your 'operator' 
assert op is not None #or raise your own exception 
if op(a,b): 
    c+=5 

И, если вы хотите, чтобы корректно обрабатывать фиктивный оператор в my_operator, вы можете сделать:

op = str_ops.get(my_operator, lambda x,y: None) #fallback: do-nothing operator 

Бонусы к этому подходу:

  • ONE if заявление. Независимо от того, сколько операторов вы обрабатываете.
  • O (1) поведение, в отличие от O (n) с ответвлениями if/elif.
  • dict очень прост: это строка идет оператор.
  • Не повторяется.
+0

+1 Приятный один :), вы также можете обрабатывать несуществующий случай. – thefourtheye

+0

Под управлением 'операторов' вы имеете в виду' str_ops'? В этом случае вам не нужна лямбда для возврата 'None'. Вы можете просто сказать «Нет» – thefourtheye

+0

@thefourtheye well, 'None' - это падение по умолчанию из' .get', поэтому мне не нужно будет указывать это. И мне нужен «лямбда», так как «Нет (a, b)» не работает так хорошо. – roippi

3

Вы можете эффективно использовать and и or операторы, как этот

if (operator == '==' and a == b) or (operator == '>' and a > b) \ 
     or (operator == '<' and a < b): 
    c += 5 
2

В качестве альтернативного решения, если вы можете доверять источнику строки оператора (или иметь какой-либо способ его проверки), вы можете использовать eval. Но вы должны быть очень осторожны при использовании eval; это может быть большой риск для безопасности, если вы не доверяете источнику ввода.

if eval("a %s b" % operator): 
    c += 5