如何使用asttokens在python中解析ast树?

gopyfrb3  于 2023-04-08  发布在  Python
关注(0)|答案(1)|浏览(200)

我尝试在对python中的AST树进行一些更改后将其解析回源代码,但格式(如空行)丢失了。在调用ast.unparse()时如何保留格式?我知道ast.unparse()本身无法恢复格式选项,但是否有方法使用asttokens之类的模块来实现这一点?

import ast
from asttokens import ASTTokens

# 1. Create a code string
code_str = """
print('1')

print('2')
"""

tree = ast.parse(code_str)

# modifications...

new_code_str = ast.unparse(tree)

# Print the original and modified code strings
print("Original code: ", code_str)
print("Modified code: ", new_code_str)

例如,我希望修改后的代码保留换行符。

6tdlim6h

6tdlim6h1#

问题不在于ast.unparse没有产生原始的空白,而是原始的空白根本不在AST * 中。
你需要一个 concrete 语法树(CST)来代替。

>>> code_str = """
... print('1')
...
... print('2')
... """
>>> cst = libcst.parse_module(code_str)
>>> print(cst.code)

print('1')

print('2')

>>> assert cst.code == code_str

您可以打印CST本身,以查看实际源代码是如何表示的。

>>> print(str(cst)[:500])
Module(
    body=[
        SimpleStatementLine(
            body=[
                Expr(
                    value=Call(
                        func=Name(
                            value='print',
                            lpar=[],
                            rpar=[],
                        ),
                        args=[
                            Arg(
                                value=SimpleString(
                                    value="'1'",

相关问题