Python 将字符串转换为运算符

Python 将字符串转换为运算符,python,evaluation,Python,Evaluation,如何将字符串(如“+”)转换为运算符plus? 谢谢 使用查找表: import operator ops = { "+": operator.add, "-": operator.sub } # etc. print ops["+"](1,1) # prints 2 您可以尝试使用eval(),但如果字符串不是来自您的,则会很危险。 否则你可能会考虑创建一个字典: ops = {"+": (lambda x,y: x+y), "-": (lambda x,y: x-y)} 等等。。。然后

如何将字符串(如
“+”
)转换为运算符plus? 谢谢

使用查找表:

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

print ops["+"](1,1) # prints 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

每个操作符都对应一个神奇的方法

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

def apply_operator(a, op, b):

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

apply_operator(1, '+', 2)

我知道你想做一些事情,比如: 5"+"7 这三件事都是通过变量传递的, 所以 例如:


我也遇到了同样的问题,使用Jupyter笔记本,无法导入操作员模块。因此,上面的代码帮助我了解情况,但无法在平台上运行。我想出了一个简单的方法来处理所有的基本函数,现在它是:(这可能是一个很大的改进,但这只是一个开始…)


使用查找dict,但使用lambdas而不是运算符库,怎么样

op = {'+': lambda x, y: x + y,
      '-': lambda x, y: x - y}
然后你可以做:

print(op['+'](1,2))
它将输出:

3

相反,您可以将其他内容转换为字符串并在python3中求值,这将给出:“+”:operator.add,AttributeError:“str”对象没有属性“add”。问题是名称不正确的
operator
参数与导入的运算符模块冲突。我猜您将使用
eval\u binary\u expr
内联
get\u operator\u fn
。将
操作符
参数更改为其他参数,如
oper
,以及对它的所有引用。请参阅我的编辑。对于Python3,您还必须将
operator.div
更改为
operator.truediv
,并修复所有打印语句。注意:这将在每次调用时从头开始重建查找
dict
,删除
O(1)
查找功能。在函数外部定义
dict
,这样它只生成一次。更彻底地说,@PaulMcG,Python3删除operator.truediv(返回浮点)的operator.div和operator.floordiv(Python2风格的整数除法)。这很好用,谢谢分享。为了验证,我们可以扩展apply_运算符。如果op='/'和b==0:如果op='/'和a==0,则返回np.inf。这不允许正常工作。
op = {'+': lambda x, y: x + y,
      '-': lambda x, y: x - y}
print(op['+'](1,2))
3