我知道如何将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 的输出吗?
我已经尝试过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 code, Generate 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)。