Python ast名称节点替换将删除括号

Python ast名称节点替换将删除括号,python,equation,abstract-syntax-tree,Python,Equation,Abstract Syntax Tree,我正在尝试用python开发一个带有最终子公式的方程解析器。其思想是,用户可能会给出一个其变量并非全部已知的等式。但可能会为这些未定义的变量定义一些子公式。然后,程序应使用子公式替换未知变量。通过@ebarr提供的帮助,我进一步发展了这个想法,但由于一个愚蠢的问题,我失败了:当用子公式替换变量时,ast.parse总是删除右括号和左括号,这会给出一个糟糕的最终公式。你知道如何保留括号吗? 谢谢 我找到了解决办法。使用代替 . 尽管我很欣赏Codegen,但我必须说它是一辆马车。Astor是在Co

我正在尝试用python开发一个带有最终子公式的方程解析器。其思想是,用户可能会给出一个其变量并非全部已知的等式。但可能会为这些未定义的变量定义一些子公式。然后,程序应使用子公式替换未知变量。通过@ebarr提供的帮助,我进一步发展了这个想法,但由于一个愚蠢的问题,我失败了:当用子公式替换变量时,ast.parse总是删除右括号和左括号,这会给出一个糟糕的最终公式。你知道如何保留括号吗? 谢谢

我找到了解决办法。使用代替 . 尽管我很欣赏Codegen,但我必须说它是一辆马车。Astor是在Codegen的基础上构建的,它更新了,并且有更多的功能。下面是一个使用Astor的示例:

导入astor
导入ast
测试代码=“x=1-(x+y)”
抽象语法树=ast.parse(测试代码)
打印到源(抽象语法树)
打印“完成”
#输出
#x=(1-(x+y))
#完成
import ast

list_know_var = ['vx', 'vy', 'vz', 'c']
equation = 'M = V  * V / c'
know_equations = {'V': 'vx + 1.'}

# initial equation
parsed_equation = ast.parse(equation)

# the class that automatically dives into the nodes of the AST
# to check for all variables definition
class AdaptEquation(ast.NodeTransformer):

    def visit_Name(self, node):
        # checking that the variable is know
        if node.id not in list_know_var:
            if node.id in know_equations.keys():
                node = ast.parse(know_equations[node.id]).body[0].value
        return node

# adapted equation
AdaptEquation().visit(parsed_equation)

# and its human readable expression
import codegen
print 'expected equation: M = (vx + 1) * (vx + 1) / c'
>>> expected equation: M = (vx + 1) * (vx + 1) / c
print 'adapted equation: ', codegen.to_source(parsed_equation)
>>> adapted equation:  M = vx + 1.0 * vx + 1.0 / c