【问题标题】:How do I replace a variable name with a value in a Python AST?如何用 Python AST 中的值替换变量名?
【发布时间】:2019-04-08 20:18:38
【问题描述】:

我希望我的用户能够在命令行中以 Python 语法输入算术表达式,并在运行时将变量名替换为值。我不想只使用eval,我想使用Abstract Syntax Trees

例如,假设我想用值3.5 重写 AST 中的每个变量,然后对其进行评估。通过阅读文档,我想出了这个。

import ast

class RewriteName(ast.NodeTransformer):

    def visit_Name(self, node):
        return ast.copy_location(ast.Num(n=3.5, ctx=node.ctx), node)

tree = ast.parse('a + b', 'eval')
tree = RewriteName().visit(tree)
ast.fix_missing_locations(tree)
o = compile(tree, '<string>', 'eval')
print(eval(o))

我希望它打印7.0,但我得到了以下错误。

o = compile(tree, '<string>', 'eval')
TypeError: expected Expression node, got Module

我了解关于 ExpressionExpr 的 AST 令人困惑的命名法,但我无法找到如何对此进行排序的示例。我尝试了compile 的各种参数,包括在tree 的各个子节点上运行它,认为其中一个可能是我需要的表达式,但到目前为止没有成功。

什么是使这个工作的示例代码?

【问题讨论】:

  • 你调用 ast.parse() 错误 - 模式(如果你要在 'eval' 模式下编译修改后的 AST 必须是 'eval')是第三个参数,而不是第二个.
  • 是的。如果我将行更改为 tree = ast.parse('a + b', '', 'eval') 它可以工作。您应该将此添加为答案,以便我可以将问题标记为已解决。

标签: python abstract-syntax-tree


【解决方案1】:

我用错误的参数调用ast.parse。正确的调用是

tree = ast.parse('a+b', '', eval)

(见上面的评论。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2022-01-04
    • 2020-10-01
    • 1970-01-01
    • 2013-01-15
    相关资源
    最近更新 更多