【问题标题】:is there any way to revert back the AST tree from the dump file of the tree?有没有办法从树的转储文件中恢复 AST 树?
【发布时间】:2018-12-24 06:30:12
【问题描述】:

c是python代码的解析树:

c=ast.parse(''' for x in y: print(x) ''')

d是tree-c的dump文件

d=ast.dump(c)

d的内容是如下字符串:

Module(
    body=[For(target=Name(id='x', ctx=Store()), iter=Name(id='y', ctx=Load()),
    body=[Expr(value=Call(func=Name(id='print', ctx=Load()), 
    args=[Name(id='x', ctx=Load())], keywords=[]))], orelse=[])])

我在网上四处寻找,看看是否可以找到一种方法来使用 d 的内容,以恢复到树 c。

有什么建议吗?

谢谢

【问题讨论】:

    标签: python abstract-syntax-tree dump


    【解决方案1】:

    您可以使用eval 从字符串中获取ast 对象:

    ast_obj = eval(d)
    

    然后,存在可以转换回源的各种第三方库(Given an AST, is there a working library for getting the source?,Python ast (Abstract Syntax Trees): get back source string of subnode)

    【讨论】:

    • 谢谢!这正是我一直在寻找的。它完美地工作
    • 你确定这行得通吗?每当我这样做时,我都会收到“NameError: name 'Module' is not defined”:eval('Module(body=[For(target=Name(id='x', ctx=Store()), iter=Name(id= 'y', ctx=Load()),body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Name(id='x', ctx= Load())], 关键字=[]))], orelse=[])])').
    • 嗨@berniethejet,是的,我相信这行得通。错误“NameError: name ... is not defined”通常表示缺少导入语句。在您的情况下,请尝试在顶部添加 from ast import *。
    • 感谢@BenJones,如果你没有告诉我,我永远也想不通。但是为什么'import ast'在这里不起作用呢? 'from ast import *' 会带来什么'import ast' 遗漏? (当然,我第一次尝试时使用了“import ast”。)
    • 'import X' 和 'from X import *' 有很大的不同:stackoverflow.com/questions/12270954/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2013-10-21
    • 2021-04-22
    • 1970-01-01
    • 2013-05-26
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多