如何将python代码转换为解析树并返回到原始代码?
我希望能够将python代码(字符串)转换为解析树,在树级别对其进行修改,然后将树转换为代码(字符串)。当转换到解析树并返回到代码中而无需任何树级修改时,生成的代码应与原始输入代码完全匹配 我想使用python来实现这一点。我找到了如何将python代码转换为解析树并返回到原始代码?,python,parsing,tree,parse-tree,Python,Parsing,Tree,Parse Tree,我希望能够将python代码(字符串)转换为解析树,在树级别对其进行修改,然后将树转换为代码(字符串)。当转换到解析树并返回到代码中而无需任何树级修改时,生成的代码应与原始输入代码完全匹配 我想使用python来实现这一点。我找到了ast和parserpython模块,但是ast树丢失了关于原始代码的信息。至于解析器模块,我似乎不知道如何操作解析树或将其转换为代码 这是我到目前为止所拥有的 导入ast 导入astor#pip安装astor 导入解析器 代码='hi=0' ast_tree=ast
ast
和parser
python模块,但是ast树丢失了关于原始代码的信息。至于解析器
模块,我似乎不知道如何操作解析树或将其转换为代码
这是我到目前为止所拥有的
导入ast
导入astor#pip安装astor
导入解析器
代码='hi=0'
ast_tree=ast.parse(代码)
代码_from_ast=astor.to_source(tree)#'hi=0\n'
parser\u tree=parser.suite(代码)
来自解析器的代码=???
正如您所提到的,内置的ast
模块没有保留许多格式信息(空格、注释等)。
在这种情况下,您需要一个具体的语法树(例如LibCST),而不是抽象语法树。(您可以通过pip安装libcst
进行安装)
下面的示例演示了如何将代码从hi=0
更改为hi=2
,方法是将代码解析为树,变异树并将树渲染回源代码。
更高级的用法可以在
这个问题对于堆栈溢出格式来说太广泛了,但我建议您搜索“无损语法树”。显然,指向文档的链接已经失效。当前的主机似乎是。
In [1]: import libcst as cst
In [2]: code = 'hi = 0'
In [3]: tree = cst.parse_module(code)
In [4]: print(tree)
Module(
body=[
SimpleStatementLine(
body=[
Assign(
targets=[
AssignTarget(
target=Name(
value='hi',
lpar=[],
rpar=[],
),
whitespace_before_equal=SimpleWhitespace(
value=' ',
),
whitespace_after_equal=SimpleWhitespace(
value=' ',
),
),
],
value=Integer(
value='0',
lpar=[],
rpar=[],
),
semicolon=MaybeSentinel.DEFAULT,
),
],
leading_lines=[],
trailing_whitespace=TrailingWhitespace(
whitespace=SimpleWhitespace(
value='',
),
comment=None,
newline=Newline(
value=None,
),
),
),
],
header=[],
footer=[],
encoding='utf-8',
default_indent=' ',
default_newline='\n',
has_trailing_newline=False,
)
In [5]: class ModifyValueVisitor(cst.CSTTransformer):
...: def leave_Assign(self, node, updated_node):
...: return updated_node.with_changes(value=cst.Integer(value='2'))
...:
In [6]: modified_tree = tree.visit(ModifyValueVisitor())
In [7]: modified_tree.code
Out[7]: 'hi = 2'