[英]arithmetic expression reader in python
我试图在python中创建一个表达式读取器来计算基本算术。
给出表达式subtract(4,add(4,times(3,4)))
- > -12
什么是建立这个的最pythonic方式? 我的方法是将表达式转换为字符串,然后创建许多if语句或切换案例以查找add
, subtract
或times
等关键字。 然后读取(
,读取一个整数和逗号,然后再次运行if语句/ switch case。如果a )
,遇到计算所需的最新关键工作算法。 几乎将关键工作和整数存储在队列中并计算最新的subtract
, times
或在队列中add
( )
。 这对我来说似乎有点太多了。 我想知道在python中是否有任何有用的内置函数可以使代码pythonic或更容易阅读
这里有一些工作代码可以让你开始使用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)
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
上编写引擎
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.