有什么方法可以将ast.dump的字符串结果转换为可执行的Python?

时间:2020-09-01 21:42:42

标签: python-3.x abstract-syntax-tree

我知道如何将python代码字符串放入 ast 树对象中,并且我知道如何从 ast.dump(树)

pythonString =  "3 * 5 + X1"
tree = ast.parse(pythonString)
astString = ast.dump(tree)
astString -> "Module(body=[Expr(value=BinOp(left=BinOp(left=Num(n=3), op=Mult(), right=Num(n=5)), op=Add(), right=Name(id='X1', ctx=Load())))])"

' astString '是我希望能够自己构造(从Python外部)并通过以下方式将其提交给Python的内容:

eval(astString)

exec(compile(astString, "<string>",mode="exec")).

但是这些都不起作用。

是否有办法将 ast.dump 中出现的字符串取回 compile exec 中? h3>

除了我们卑微的程序员之外,世界上没有任何东西会消耗 ast.dump 的输出吗?

我已经尝试过ast.dump的所有选项组合,例如' annotate_fields '和' include_attributes '这样的选项:

astString = ast.dump(tree, annotate_fields=False, include_attributes=False)...

我已经尝试使用各种值的诸如 filename '和' mode '之类的各种值的compile和exec组合:

exec(compile(astString,filename="<ast>",mode="exec"))
compile(astString,filename="",mode="exec", ast.PyCF_ONLY_AST)
...

我尝试了 astunparse

astunparse.unparse(astString)
astunparse.dump(astString)
...

另一个问题(is there any way to revert back the AST tree from the dump file of the tree?)认为这可行:

pythonString =  "3 * 5 + X1"
tree = ast.parse(pythonString)
astString = ast.dump(tree)
results = exec( astString )

但我所得到的只是'NameError:name'Module'is not defined'(至少令人鼓舞),即使是精确地复制了他们的示例也是如此。该消息提示需要将 ast.parse ast.dump 设置为'mode ='exec',但这也不起作用。

ast.dump 的输出似乎仅用于调试目的,而不像文档所声称的那样“主要用于调试”。

我需要一个适用于“陈述”的解决方案,即不是适用于单个“表达式”的解决方案。我相信这意味着它必须使用' exec '而不是' eval ',并且astString将始终以' Module '开头。我要提交的代码块比这里显示的' pythonString '玩具示例更大。

我还查看了以下有用的帖子:

Create a function from a modular template in python 3.6+ with readable and debuggable codeGenerate ast from constituent elements without using ast.parse in python,以及 Given an AST, is there a working library for getting the source?

此致

我仅使用Python 3(实际上是3.8)。

0 个答案:

没有答案