登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  python教程

Python pprint 怎样控制嵌套对象的展开深度

来源:17golang原创

时间:2026-10-31 09:10:19 205浏览 收藏

处理配置、接口响应或树形数据时,pprint 默认会尽量把对象完整展开;对象一深,日志就很难读。解决办法是给 pprint.pp()、pprint.pformat() 或 PrettyPrinter 传入 depth,它表示允许展示的嵌套层数,超过边界的子对象会显示为 ...。这只是展示边界,不会修改原对象。

官方文档:https://docs.python.org/3/library/pprint.html

要点速览
  • depth=None 表示不限制深度;设置为整数后,超过层数的子结构显示为 ...。
  • width 控制换行参考宽度,compact 影响序列排版,不能代替 depth。
  • pprint() 直接输出,pformat() 返回字符串;需要写日志或接口响应时优先用后者。

先分清 pprint 的三个输出入口

pprint.pp(obj) 适合临时查看,直接向输出流打印;pprint.pformat(obj) 返回格式化后的字符串,适合拼接日志;PrettyPrinter 则把同一组选项保存下来,适合一个模块反复使用。下面的对象故意包含三层嵌套,方便观察 depth 的变化:

from pprint import pp, pformat

payload = {
    "user": {
        "profile": {
            "contact": {"email": "dev@example.com", "verified": True},
            "roles": ["editor", "reviewer"],
        },
        "active": True,
    }
}

# pp 直接打印;pformat 返回字符串,便于写入日志或继续处理。
pp(payload)
text = pformat(payload, depth=2)
print(text)

只需要临时看值时用 pp 最直接;如果要把同一份结果交给日志系统,pformat 不会额外改变对象,更方便统一格式。

Python pprint 的 pp、pformat 与 PrettyPrinter 入口以及嵌套对象输出边界结构说明图
图1:结构说明图,展示三个 pprint 入口、格式化参数和嵌套对象之间的静态关系,不是运行截图。

用 depth 控制真正可见的嵌套层级

depth 是控制展开深度的核心参数。设为 1 时只看最外层容器的成员;设为 2 时可以继续看到成员容器的直接内容;更深部分统一显示为 ...。它不会删除键值,也不会生成一个被裁剪的新字典:

from pprint import pprint

tree = {
    "service": {
        "database": {
            "pool": {"min": 2, "max": 10},
            "timeout": 3,
        },
        "cache": {"enabled": True, "ttl": 60},
    }
}

# depth=2 只展示到第二层,更深的内容用省略号表示。
pprint(tree, depth=2, width=72, sort_dicts=False)

排查“顶层字段是否存在”可以用较小的深度;需要确认连接池的具体字段时再提高深度。这样做比把整棵对象一次性打印出来更容易定位结构,而且不会误以为 ... 是原数据中的值。

width、compact 和 sort_dicts 负责排版,不负责裁剪

深度确定后,剩下的问题通常是“同样的信息怎样排得更清楚”。width 是期望的最大行宽,结构无法压进该宽度时会尽力换行;compact=True 允许长序列在一行放入更多元素;sort_dicts 决定字典是否按键排序。对比两次输出时,固定排序往往更容易阅读:

from pprint import PrettyPrinter

settings = {
    "retry": {"max": 3, "backoff": [1, 2, 4]},
    "endpoint": {"host": "api.internal", "port": 8443},
}

# 保存一组稳定的排版策略:限制深度、固定宽度并按键排序。
printer = PrettyPrinter(
    depth=2,
    width=60,
    compact=True,
    sort_dicts=True,
)
printer.pprint(settings)

要注意,width 变小只会增加换行,compact 只改变序列的排布方式,它们都不会让更多层级出现。反过来,把 depth 调大也不一定让输出更紧凑,几项参数应该按“先限制信息量,再调整版式”的顺序设置。

Python pprint 的 depth 深度边界与 width、compact、sort_dicts 排版参数关系说明图
图2:关系说明图,展示 depth 的展示边界,以及 width、compact、sort_dicts 对排版的影响,不是运行结果截图。

省略号、递归对象和可读性要分开判断

有限 depth 产生的 ... 表示“这里没有继续展开”。如果容器直接或间接引用自己,pprint 还会输出类似 的递归标记,这与深度限制不是一回事。需要判断格式化结果是否可以重建时,可以调用 isreadable();文件、套接字、自定义对象等内容本来就可能无法作为 Python 字面量重新加载。

import pprint

items = {"name": "job", "options": {"retry": 3}}
text = pprint.pformat(items, depth=1)

# isreadable 检查的是“能否重建”,不是“画面是否足够详细”。
print(text)
print(pprint.isreadable(items))

因此,日志审阅时先看 depth 是否满足当前问题,再看排序和换行;不要通过解析 ... 来恢复数据,也不要把一段好看的调试文本当成序列化格式。

常见问题

depth=0 会显示什么?

它会限制递归展开,通常只保留顶层对象的概览。实际排版还会受到对象类型和其他参数影响,建议用一个小样本确认可读性。

想得到完整数据,应该把 depth 设很大吗?

如果确实需要完整展示,可以使用默认的 None;但深层日志可能很大。更稳妥的做法是先按字段或业务边界拆分,再用 depth 控制每次查看的范围。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>