使用字符串作为运算符?

时间:2013-11-17 02:44:28

标签: python operators performance repeat

例如,假设我有一堆这样的赋值语句:

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

我给出的if if if语句和赋值只是示例,但在我写的程序中,它们真的很长。只是在操作员不同的地方出现了一个小小的变化,所以我不想在所有这些条件下一遍又一遍地重复相同的长代码。有太多的条件,代码将重复多次..那么有一个“更快”的方法来做到这一点?我可以将字符串定义为运算符吗?还是更好的方法?

3 个答案:

答案 0 :(得分: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

这种方法的奖励:

  • 一个if声明。无论您处理多少运营商。
  • O(1)行为,而不是带有分支的O(n)if / elif语句。
  • dict非常具有声明性:字符串转到运算符。
  • 不重复自己。

答案 1 :(得分:3)

您可以有效地使用andor运算符,例如

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

答案 2 :(得分:2)

作为替代解决方案,如果您可以信任运算符字符串的来源(或者有某种方法来验证它),则可以使用eval。但是在使用eval时你必须​​非常小心;如果您不信任输入源,这可能是一个很大的安全风险。

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