将AST节点转换为python代码

时间:2016-10-13 20:04:46

标签: python abstract-syntax-tree

假设我有以下字符串:

code = """
if 1 == 1 and 2 == 2 and 3 == 3:
    test = 1
"""

以下代码在AST中转换该字符串。

ast.parse(code)

然后我有一棵树:

Module(body=[<_ast.If object at 0x100747358>])
  If(test=BoolOp(op=And(), values=[<_ast.Compare object at 0x100747438>, <_ast.Compare object at 0x100747a90>, <_ast.Compare object at 0x100747d68>]), body=[<_ast.Assign object at 0x100747e48>], orelse=[])

我想知道是否有办法将对象at.If转换为字符串if 1 == 1 and 2 == 2 and 3 == 3:

我知道可以遍历子节点,但这样做过于复杂。

3 个答案:

答案 0 :(得分:3)

您可以使用unparse库,它基本上只是来自核心的代码,可以单独重新打包。

首先,安装库:

pip install astunparse

然后,通过它运行AST模块以立即获取源代码。所以跑步:

import ast
import astunparse

code = """
if 1 == 1 and 2 == 2 and 3 == 3:
    test = 1
"""

node = ast.parse(code)

astunparse.unparse(node)

将输出:

'\nif ((1 == 1) and (2 == 2) and (3 == 3)):\n    test = 1\n'

答案 1 :(得分:3)

ast.get_source_segment已在python 3.8中添加:

>>> import ast

>>> code = """
>>> if 1 == 1 and 2 == 2 and 3 == 3:
>>>     test = 1
>>> """
>>> node = ast.parse(code)
>>> ast.get_source_segment(code, node.body[0])
'if 1 == 1 and 2 == 2 and 3 == 3:\n    test = 1'

答案 2 :(得分:1)

Python 3.9 引入了 ast.unparse,它正是这样做的,即它反转了 ast.parse。使用您的示例:

import ast

code = """
if 1 == 1 and 2 == 2 and 3 == 3:
    test = 1
"""

tree = ast.parse(code)
print(ast.unparse(tree))

这将打印出来:

if 1 == 1 and 2 == 2 and (3 == 3):
    test = 1

请注意,可能与原始输入略有不同。