如何在python3中使用AST递归简化数学表达式?

吉列尔莫·莫斯(Guillermo Mosse)

我有这个数学表达式:

tree = ast.parse('1 + 2 + 3 + x')

对应于以下抽象语法树:

Module(body=[Expr(value=BinOp(left=BinOp(left=BinOp(left=Num(n=1), op=Add(), right=Num(n=2)), op=Add(), right=Num(n=3)), op=Add(), right=Name(id='x', ctx=Load())))])

我想简化一下-也就是说,

Module(body=[Expr(value=BinOp(left=Num(n=6), op=Add(), right=Name(id='x', ctx=Load())))])

根据文档,我应该使用NodeTransformer类。文档中的建议如下:

请记住,如果您正在操作的节点具有子节点,则必须自己转换子节点或首先为该节点调用generic_visit()方法。

我尝试实现自己的转换器:

class Evaluator(ast.NodeTransformer):
    def visit_BinOp(self, node):
        print('Evaluating ', ast.dump(node))
        for child in ast.iter_child_nodes(node):
            self.visit(child)

        if type(node.left) == ast.Num and type(node.right) == ast.Num:
            print(ast.literal_eval(node))
            return ast.copy_location(ast.Subscript(value=ast.literal_eval(node)), node)
        else:
            return node

在这种特定情况下,它应该做的是将1 + 2简化为3,然后将3 + 3简化为6。它确实简化了我想简化的二进制运算,但是它没有更新原始的语法树。我尝试了不同的方法,但是仍然不知道如何以深度优先的方式递归简化所有二进制操作。有人能指出我正确的方向吗?

谢谢。

客人

该方法有三个可能的返回值visit_*

  1. None 这意味着该节点将被删除,
  2. node (节点本身),这意味着将不会应用任何更改,
  3. 一个新节点,它将替换旧节点。

因此,当您要用替换BinOpa时,Num您需要返回一个新Num节点。表达式的求值不能通过来完成,ast.literal_eval因为此函数仅求值文字(而不是任意表达式)。相反,您可以使用eval例如。

因此,您可以使用以下节点转换器类:

import ast

class Evaluator(ast.NodeTransformer):
    ops = {
        ast.Add: '+',
        ast.Sub: '-',
        ast.Mult: '*',
        ast.Div: '/',
        # define more here
    }

    def visit_BinOp(self, node):
        self.generic_visit(node)
        if isinstance(node.left, ast.Num) and isinstance(node.right, ast.Num):
            # On Python <= 3.6 you can use ast.literal_eval.
            # value = ast.literal_eval(node)
            value = eval(f'{node.left.n} {self.ops[type(node.op)]} {node.right.n}')
            return ast.Num(n=value)
        return node

tree = ast.parse('1 + 2 + 3 + x')
tree = ast.fix_missing_locations(Evaluator().visit(tree))
print(ast.dump(tree))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在python3中使用正则表达式获取值

来自分类Dev

如何在mysql sql中使用数学表达式?

来自分类Dev

在Python3上不使用eval()评估数学表达式

来自分类Dev

如何在Isabelle中简化选项表达式?

来自分类Dev

如何在sympy中替换和简化表达式?

来自分类Dev

如何在Python 3中使用正则表达式查找字符串?

来自分类Dev

如何在python 3.7中使用正则表达式来具有2或3组?

来自分类Dev

如何在Python中使用非密码相关的正则表达式将3组中的2组匹配?

来自分类Dev

如何在python中使用正则表达式?

来自分类Dev

如何定量测量数学表达式的简化程度

来自分类Dev

如何在Swift 3中使用UITextFields创建开关表达式

来自分类Dev

如何在Angularjs中渲染Wiris数学表达式

来自分类Dev

如何在 es 中评估简单的数学表达式?

来自分类Dev

python中的正则表达式:如何在模式中使用可变字符串?

来自分类Dev

如何在python中的正则表达式中使用字典?

来自分类Dev

如何在python中使用正则表达式从csv文件中获取数据

来自分类Dev

如何在 Python 中使用正则表达式替换缩写中的点?

来自分类Dev

递归函数以简化javascript中的表达式

来自分类Dev

让表达式在AST中如何工作?

来自分类Dev

如何在Python中使用递归正则表达式或其他方法来递归验证类似BBcode的标记?

来自分类Dev

如何使用递归最大化和最小化数学表达式?

来自分类Dev

如何在正则表达式中存储值以在同一正则表达式中使用

来自分类Dev

如何在 sqlalchemy 表达式语言中使用 jsonb 与选择表达式中的整数进行比较?

来自分类Dev

如何在python 2.7中使用正则表达式在列表中插入换行符?

来自分类Dev

如何在AS3中使用正则表达式在所有空格上拆分String?

来自分类Dev

如何在python中使用正则表达式从字符串中检索子字符串

来自分类Dev

如何在python中使用正则表达式提取文本文件中的标题?

来自分类Dev

如何在Python中使用正则表达式按括号拆分列表中的值?

来自分类Dev

如何在python中使用正则表达式在字符串列表中查找单词

Related 相关文章

  1. 1

    如何在python3中使用正则表达式获取值

  2. 2

    如何在mysql sql中使用数学表达式?

  3. 3

    在Python3上不使用eval()评估数学表达式

  4. 4

    如何在Isabelle中简化选项表达式?

  5. 5

    如何在sympy中替换和简化表达式?

  6. 6

    如何在Python 3中使用正则表达式查找字符串?

  7. 7

    如何在python 3.7中使用正则表达式来具有2或3组?

  8. 8

    如何在Python中使用非密码相关的正则表达式将3组中的2组匹配?

  9. 9

    如何在python中使用正则表达式?

  10. 10

    如何定量测量数学表达式的简化程度

  11. 11

    如何在Swift 3中使用UITextFields创建开关表达式

  12. 12

    如何在Angularjs中渲染Wiris数学表达式

  13. 13

    如何在 es 中评估简单的数学表达式?

  14. 14

    python中的正则表达式:如何在模式中使用可变字符串?

  15. 15

    如何在python中的正则表达式中使用字典?

  16. 16

    如何在python中使用正则表达式从csv文件中获取数据

  17. 17

    如何在 Python 中使用正则表达式替换缩写中的点?

  18. 18

    递归函数以简化javascript中的表达式

  19. 19

    让表达式在AST中如何工作?

  20. 20

    如何在Python中使用递归正则表达式或其他方法来递归验证类似BBcode的标记?

  21. 21

    如何使用递归最大化和最小化数学表达式?

  22. 22

    如何在正则表达式中存储值以在同一正则表达式中使用

  23. 23

    如何在 sqlalchemy 表达式语言中使用 jsonb 与选择表达式中的整数进行比较?

  24. 24

    如何在python 2.7中使用正则表达式在列表中插入换行符?

  25. 25

    如何在AS3中使用正则表达式在所有空格上拆分String?

  26. 26

    如何在python中使用正则表达式从字符串中检索子字符串

  27. 27

    如何在python中使用正则表达式提取文本文件中的标题?

  28. 28

    如何在Python中使用正则表达式按括号拆分列表中的值?

  29. 29

    如何在python中使用正则表达式在字符串列表中查找单词

热门标签

归档