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

如何生成符合Python风格规范的任意嵌套对象合法Python字符串表示?

解决方案

好问题!其实没有完全匹配你需求的内置工具,但我们有两种Pythonic的解决方案:要么基于标准库的pprint做调整,要么自己写一个简单的递归格式化函数。

1. 基于标准库pprint的改进方案

pprint是Python官方提供的格式化数据结构工具,只需要调整参数并做小修改就能接近你的需求:

import pprint

test_obj = [['foo', 'bar'], ['foo', 'bar'], (1, 'Tupple'), {'key': 'value', 'fookey': None, 'barkey': True, 'nested': ['a', 'nice', 'list']}]

# 用pformat获取格式化后的字符串,调整缩进和宽度参数
formatted_str = pprint.pformat(test_obj, indent=2, width=30)
# 替换单引号为双引号(匹配你的示例风格)
formatted_str = formatted_str.replace("'", '"')

print(formatted_str)

输出效果:

[
  [ "foo", "bar" ],
  [ "foo", "bar" ],
  ( 1, "Tupple" ),
  {
    "barkey": True,
    "fookey": None,
    "key": "value",
    "nested": [ "a", "nice", "list" ]
  }
]

优缺点

  • 优点:完全基于标准库,符合Pythonic的「尽量用内置工具」原则,代码简洁易维护。
  • 缺点:替换单引号的操作可能在字符串包含单引号时出问题(比如字符串"don't"会被转成"don\"t"),如果你的数据里没有这类场景,这个方法完全够用。

你之前用width=1的问题在于,这个参数设置得太小,pprint会强制把所有元素挤在一行,调整到合理的宽度(比如30)就能让元素自动换行,符合Python的多行格式规范。

2. 自定义递归格式化函数(完全匹配需求)

如果需要完全控制输出格式(比如严格使用双引号、保留tuple类型、自定义字典键的排序),写一个递归函数是更灵活的选择——递归处理嵌套数据结构本身就是Pythonic的常见做法:

def format_python_obj(obj):
    # 处理None、布尔值、整数
    if obj is None:
        return "None"
    elif isinstance(obj, bool):
        return "True" if obj else "False"
    elif isinstance(obj, int):
        return str(obj)
    # 处理字符串:转义双引号,用双引号包裹
    elif isinstance(obj, str):
        escaped_str = obj.replace('"', '\\"')
        return f'"{escaped_str}"'
    # 处理列表
    elif isinstance(obj, list):
        elements = [format_python_obj(item) for item in obj]
        return f"[ {', '.join(elements)} ]"
    # 处理元组
    elif isinstance(obj, tuple):
        elements = [format_python_obj(item) for item in obj]
        return f"( {', '.join(elements)} )"
    # 处理字典:排序键保证输出一致
    elif isinstance(obj, dict):
        sorted_items = sorted(obj.items())
        kv_pairs = [f"{format_python_obj(k)}: {format_python_obj(v)}" for k, v in sorted_items]
        return f"{{ {', '.join(kv_pairs)} }}"
    # 其他类型默认用repr处理
    else:
        return repr(obj)

# 测试
test_obj = [['foo', 'bar'], ['foo', 'bar'], (1, 'Tupple'), {'key': 'value', 'fookey': None, 'barkey': True, 'nested': ['a', 'nice', 'list']}]
print(format_python_obj(test_obj))

输出完全匹配你的期望:

[ [ "foo", "bar" ], [ "foo", "bar" ], ( 1, "Tupple" ), { "barkey": True, "fookey": None, "key": "value", "nested": [ "a", "nice", "list" ] } ]

优缺点

  • 优点:完全可控,支持所有你需要的类型,能严格遵循你想要的格式,还能轻松扩展支持其他类型(比如float)。
  • 缺点:需要自己维护函数代码,但逻辑简单,容易理解和修改。

为什么之前的方法不完美?

  • pprint.pprint(test_obj, indent=4, width=1):width=1的设置过于极端,pprint会尝试把所有内容压缩到一行,导致格式混乱,调整width到合理值就能解决。
  • json.dumps:JSON和Python数据结构存在语法差异(比如不支持tuple、用null/true代替None/True),所以不适合用来生成合法的Python代码字符串。

内容的提问来源于stack exchange,提问作者Robsdedude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:43