python中的算术表达式阅读器

时间:2013-11-27 01:27:15

标签: python

我试图在python中创建一个表达式阅读器来计算基本算术。

给出表达式subtract(4,add(4,times(3,4))) - > -12

建立这个的最pythonic方法是什么?我的方法是将表达式转换为字符串,然后创建许多if语句或切换案例以查找addsubtracttimes等关键字。然后阅读(,读取整数和逗号,然后再次运行if语句/开关案例。如果遇到),那就是计算最新关键工作所需的算术时。几乎将关键工作和整数存储在队列中,并在找到subtract时计算队列中的最新timesadd)。这对我来说似乎有点太多了。我想知道在python中是否有任何有用的内置函数可以使代码pythonic或更容易阅读

2 个答案:

答案 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方式只是编写函数subtractaddtimes等。然后传递给eval。请记住将任意字符串传递给eval

的所有危险
>>> from operator import add, sub, mul
>>> subtract = sub
>>> times = mul
>>> eval("subtract(4,add(4,times(3,4)))")
-12

如果您不能相信字符串的内容,那么您必须权衡尝试清理字符串,而不是在ast.parse

之上编写引擎