You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AST模块生成带换行缩进与双引号的格式化字典输出

如何使用AST模块生成带换行缩进与双引号的格式化字典输出

嘿,我明白你现在遇到的问题了——用AST生成字典后,ast.unparse输出的是挤成一行的单引号格式,完全不是你想要的带缩进换行、双引号的样子对吧?别着急,咱们一步步来解决这个问题。

首先得说清楚,ast.unparse的格式化逻辑是固定的:默认会把短字典压缩成一行,而且字符串会自动选择单/双引号(字符串里没有单引号时就用单引号)。所以要实现你要的格式,咱们得从两个核心点入手:让字典键值对换行并缩进,以及强制使用双引号。

方法一:用第三方库astor(简单省心)

如果你能安装第三方库的话,astor是专门处理AST代码生成的工具,它的输出格式比原生ast.unparse友好太多,还能支持基础的格式化自定义。

先通过pip install astor安装库,然后修改你代码的最后部分:

import astor

# 生成带自动换行缩进的代码
source_code = astor.to_source(my_awesome_module_node)
# 替换单引号为双引号(如果你的字符串里没有单引号,这个替换是安全的)
source_code = source_code.replace("'", '"')
print(source_code)

运行后就能直接得到你想要的格式:

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

方法二:纯原生实现(无需第三方库)

如果不想依赖第三方库,咱们可以手动处理原生输出的代码,或者自己遍历AST节点生成代码。这里给你一个针对简单字典的处理方案:

raw_code = ast.unparse(my_awesome_module_node)
# 先把单引号替换成双引号
raw_code = raw_code.replace("'", '"')
# 处理字典的换行缩进
if "={" in raw_code and "}" in raw_code:
    # 拆分赋值语句和字典内容
    left_part, dict_content = raw_code.split("={", 1)
    dict_content = dict_content.rstrip("}")
    # 给每个键值对添加缩进
    formatted_kv = [f"    {kv.strip()}" for kv in dict_content.split(",") if kv.strip()]
    # 重新拼接成目标格式
    final_code = f"{left_part}}}{{\n{',\n'.join(formatted_kv)}\n}}"
else:
    final_code = raw_code

print(final_code)

这个思路是把原生输出的一行代码拆解开,手动给每个键值对加上缩进和换行后再拼回去。不过要注意,这个方法只适用于结构简单的字典,如果你的字典嵌套了其他复杂AST节点,可能需要更细致的处理逻辑。

补充说明:双引号的细节

如果你的字符串本身包含单引号,ast.unparse会自动用双引号包裹,这时候就不需要额外替换了。但如果想强制所有字符串都用双引号,直接替换是最简单的方式(要是字符串里有双引号需要转义,替换时要注意处理转义字符)。

备注:内容来源于stack exchange,提问作者Asdfg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:27:58