如何使用ast模块使用换行符格式化输出

问题描述 投票:0回答:1

我正在尝试使用 AST 模块生成一些代码。这就是我的代码的样子:

我想在每个键后添加具有正确格式的新行,以便输出看起来已格式化。

my_awesome_properties = [
    (ast.Constant(value="key1"), ast.Constant(value="value1")),
    (ast.Constant(value="key2"), ast.Constant(value="value2")),
    (ast.Constant(value="key3"), ast.Constant(value="value3")),
]

my_awesome_properties_dict = ast.Dict(
    keys=[key for key, value in my_awesome_properties],
    values=[value for key, value in my_awesome_properties]
)

my_awesome_properties_assignment = ast.Assign(
    targets=[ast.Name(id='my_awesome_properties', ctx=ast.Store())],
    value=my_awesome_properties_dict
)

my_awesome_properties_assignment.lineno = 1


my_awesome_module_node = ast.Module(
    body=[
        my_awesome_properties_assignment,
    ],
    type_ignores=[]
)

print(ast.unparse(my_awesome_module_node))

这会生成输出为

my_awesome_properties = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

如何在每个键后使用正确的格式添加新行,以便输出看起来像这样带有双引号?

my_awesome_properties = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
}
python abstract-syntax-tree
1个回答
0
投票

嗯,AST 本身正在生成正确的结构,只是没有正确格式化它,因为它没有任何选项来做到这一点。相反,您可以对字典进行一些快速的后脚本修改以获得您想要的输出。

unparsed_code = ast.unparse(my_awesome_module_node)

formatted_code = unparsed_code.replace(
    "{",
    "{\n    "
).replace(
    "}", 
    "\n}"
).replace(
    ", ", 
    ",\n    "
)

print(formatted_code)

这应该适合您的目的。

© www.soinside.com 2019 - 2024. All rights reserved.