我试图在python中创建一个表达式阅读器来计算基本算术。
给出表达式subtract(4,add(4,times(3,4)))
- > -12
建立这个的最pythonic方法是什么?我的方法是将表达式转换为字符串,然后创建许多if语句或切换案例以查找add
,subtract
或times
等关键字。然后阅读(
,读取整数和逗号,然后再次运行if语句/开关案例。如果遇到)
,那就是计算最新关键工作所需的算术时。几乎将关键工作和整数存储在队列中,并在找到subtract
时计算队列中的最新times
,add
或)
。这对我来说似乎有点太多了。我想知道在python中是否有任何有用的内置函数可以使代码pythonic或更容易阅读
答案 0 :(得分:7)
以下是一些工作代码,可帮助您开始使用ast
:
import ast
s = 'subtract(4,add(4,times(3,4)))'
# Probably better to use functions from the operator module here :-)
functions = {'subtract': lambda a,b: a-b,
'add': lambda a, b: a+b,
'times': lambda a,b: a*b}
def _evaluate(node):
if isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.Name):
return functions[node.id]
elif isinstance(node, ast.Call):
function = _evaluate(node.func)
return function(*[_evaluate(n) for n in node.args])
else:
raise ValueError('Unknown node type: %s', type(node))
def evaluate(s):
tree = ast.parse(s)
node = tree.body[0].value
return _evaluate(node)
print evaluate(s)
答案 1 :(得分:5)
Pythonic方式只是编写函数subtract
,add
,times
等。然后传递给eval
。请记住将任意字符串传递给eval
>>> from operator import add, sub, mul
>>> subtract = sub
>>> times = mul
>>> eval("subtract(4,add(4,times(3,4)))")
-12
如果您不能相信字符串的内容,那么您必须权衡尝试清理字符串,而不是在ast.parse