如何使用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
相关产品推荐
相关产品推荐

