繁体   English   中英

python中的算术表达式阅读器

[英]arithmetic expression reader in python

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

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

什么是建立这个的最pythonic方式? 我的方法是将表达式转换为字符串,然后创建许多if语句或切换案例以查找addsubtracttimes等关键字。 然后读取( ,读取一个整数和逗号,然后再次运行if语句/ switch case。如果a ) ,遇到计算所需的最新关键工作算法。 几乎将关键工作和整数存储在队列中并计算最新的subtracttimes或在队列中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的方法是只写函数, subtractaddtimes等。然后传递给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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM