从组成元素生成ast,而不使用python中的ast.parse
使用python从组成元素生成ast,而不使用python中的ast.parse,python,abstract-syntax-tree,Python,Abstract Syntax Tree,使用pythonast模块,可以生成一个简单的抽象语法树,如下所示: import ast module = ast.parse('x=3') import astor astor.to_source(module) import astor, ast module = ast.parse('x=3') ast.dump(module) 这将生成一个模块对象,可使用astor库检索该对象的源代码,如下所示: import ast module = ast.parse('x=3') imp
ast
模块,可以生成一个简单的抽象语法树,如下所示:
import ast
module = ast.parse('x=3')
import astor
astor.to_source(module)
import astor, ast
module = ast.parse('x=3')
ast.dump(module)
这将生成一个模块
对象,可使用astor
库检索该对象的源代码,如下所示:
import ast
module = ast.parse('x=3')
import astor
astor.to_source(module)
import astor, ast
module = ast.parse('x=3')
ast.dump(module)
生成
'x = 3\n'
在不使用
ast.parse
方法的情况下,是否可以从其组成元素构成完全相同的模块对象,以便astor.to\u source
方法可以生成相同的源代码?如果是,怎么办?我想我刚刚找到了。使用ast.dump
可以检查树的内容,如下所示:
import ast
module = ast.parse('x=3')
import astor
astor.to_source(module)
import astor, ast
module = ast.parse('x=3')
ast.dump(module)
这将产生以下输出,揭示底层结构:
"Module(body=[Assign(targets=[Name(id='x', ctx=Store())], value=Num(n=3))])"
我们可以利用这些信息从头开始构建同一棵树,然后使用astor
恢复源代码:
module = ast.Module(body=[ast.Assign(targets=[ast.Name(id='x', ctx=ast.Store())], value=ast.Num(n=3))])
astor.to_source(module)
其输出如下:
'x = 3\n'
但是,有一个问题,因为执行此新树会导致错误:
exec(compile(module, filename='<ast>', mode="exec"))
exec(编译(模块,文件名=“”,mode=“exec”))
回溯(最近一次调用):文件“”,第1行,在
TypeError:stmt中缺少必填字段“lineno”
要解决此问题,必须使用ast.fix\u missing\u locations
方法将行号添加到每个节点