在Python中间接调用内置运算符

在Python中间接调用内置运算符,python,Python,假设您有一个小型计算器程序,该程序将数字和运算符作为输入,然后打印出应用指定操作的结果。因此,如果您输入“4+5”,它将打印出“9”。很简单,对吧?我想写的是这样的东西: a, op, b = raw_input().split() print somehowInvokeOperator(op, a, b) 问题是“somehowInvokeOperator()”部分。在不使用(a)eval()或(b)某种类型的字典映射键(如“+”和“-”)到执行适当操作的函数的情况下,是否可以执行此操作?g

假设您有一个小型计算器程序,该程序将数字和运算符作为输入,然后打印出应用指定操作的结果。因此,如果您输入“4+5”,它将打印出“9”。很简单,对吧?我想写的是这样的东西:

a, op, b = raw_input().split()
print somehowInvokeOperator(op, a, b)

问题是“somehowInvokeOperator()”部分。在不使用(a)eval()或(b)某种类型的字典映射键(如“+”和“-”)到执行适当操作的函数的情况下,是否可以执行此操作?getattr()似乎对此不起作用。我并不真的需要这些代码,我只是想看看是否可以用Python像在其他动态语言中一样优雅地解决这个问题。

如果你真的想这样做,你需要标准的
操作符
模块。另见。是的,一本功能齐全的词典将是实现这一目标的完美动态方式

import operator
operations = {'+' : operator.add}
result = operations[op](a, b)

基本上不需要,您至少需要有一个字典或函数来将运算符字符映射到它们的实现。它实际上比这复杂一点,因为不是所有的操作符都采用
a[op]b
的形式,所以通常需要进行一些解析;有关通信的完整列表,以及您可能希望用于运算符实现的函数,请参阅


如果您只想实现像+-*/%**这样的二进制算术运算符,那么字典就足够了。

警告:这根本不是pythonic!!(违反了国家的所有规定!)

这是一本神奇的单行词典:

ops = eval( '{%s}'%','.join([('\''+op + '\' : lambda a,b: a ' + op + ' b') for op in '+-*/%']) )
这就是你的字典。。你可以用它

ops['+'](10,4) #returns 14
基本思想是将每个运算符映射到lambda函数:

{ '+' : lambda a,b: a + b }

同样的问题是,我需要将“+”映射到“add”,而且——足够令人惊讶的是——如果a是整数,b是浮点:>>>(4)#因此,您没有在标准库中重新创建效率较低的函数版本。您应该补充一点,这个答案过去完全不同。。至少这些注释是有意义的。Python中的名称空间大多是作为字典实现的,因此即使
getattr()
起作用,它也将是“某种类型的字典映射”。如果您想学习如何编写编译器/解释器,请看一看这一点,不是真的,我从不使用eval,但在这种情况下,这是唯一的选择。这个“解决方案”源自我对joeforker答案的评论,我花了一段时间来整理。