2009-11-16 271 views
17

如何将诸如“+”的字符串转换为运算符加号?谢谢!将字符串转换为运算符

+1

而不是一个神奇的方法,你可以转换成其他的事情串并评估HTTP:

但是,您也可以这篇文章关于数学解析器感兴趣://stackoverflow.com/questions/729248/python-eval-and-globals – Xinus

回答

56

使用查找表:

import operator 
ops = { "+": operator.add, "-": operator.sub } # etc. 

print ops["+"](1,1) # prints 2 
-12

您可以使用eval像这样:

eval("+") 
+5

这会导致语法错误 – Xinus

+2

它也是非常危险的使用eval – Alvin

+1

无用的“答案”只是产生语法错误,这甚至不显着的“做错的方式”。 –

2

您可以尝试使用eval(),但如果字符串不是来自你很危险。 否则你可能会考虑创建一个字典:

ops = {"+": (lambda x,y: x+y), "-": (lambda x,y: x-y)}

等等,然后调用

ops['+'] (1,2)
或者,用户输入:

if ops.haskey(userop): 
    val = ops[userop](userx,usery) 
else: 
    pass #something about wrong operator
12
import operator 

def get_operator_fn(op): 
    return { 
     '+' : operator.add, 
     '-' : operator.sub, 
     '*' : operator.mul, 
     '/' : operator.div, 
     '%' : operator.mod, 
     '^' : operator.xor, 
     }[op] 

def eval_binary_expr(op1, oper, op2): 
    op1,op2 = int(op1), int(op2) 
    return get_operator_fn(oper)(op1, op2) 

print eval_binary_expr(*("1 + 3".split())) 
print eval_binary_expr(*("1 * 3".split())) 
print eval_binary_expr(*("1 % 3".split())) 
print eval_binary_expr(*("1^3".split())) 
+0

在python3中,这给出: '+':operator.add, AttributeError:'str'object has no attribute'add' –

+0

问题是,参数与导入的操作员模块发生冲突。我猜你已用'eval_binary_expr'内联'get_operator_fn'。将'operator'参数更改为其他内容,如'oper'和所有对它的引用。看我的编辑。 – PaulMcG

+0

对于Python3,您还必须将'operator.div'更改为'operator.truediv',并修复所有打印语句。 – PaulMcG

1

在我看来,提出阿姆农答案是正确的。 http://effbot.org/zone/simple-top-down-parsing.htm

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/18628184) – xgord

+0

这属于评论部分,因为它不是一个直接的答案。 – Pablo

0

存在对应于各运营商

OPERATORS = {'+': 'add', '-': 'sub', '*': 'mul', '/': 'div'} 

def apply_operator(a, op, b): 

    method = '__%s__' % OPERATORS[op] 
    return getattr(b, method)(a) 

apply_operator(1, '+', 2) 
+1

这个效果很好,谢谢分享。为了验证,我们可以扩展apply_operator。 如果op == '/' 和b == 0: \t返回np.inf 如果op == '/' 和== 0: \t返回0 – iratzhash

+0

这并不让[NotImplemented](HTTPS: //docs.python.org/3/library/constants.html#NotImplemented)正常工作。 – wim