当前位置:首页 > 文章列表 > 文章 > python教程 > Python pprint 怎样控制嵌套对象的展开深度

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

来源:17golang原创 2026-10-31 09:10:19 0浏览 收藏

处理配置、接口响应或树形数据时,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删除
Go bitset 怎样对两组标记计算对称差Go bitset 怎样对两组标记计算对称差
上一篇
Go bitset 怎样对两组标记计算对称差
Linux mcookie 怎样从文件内容补充随机输入
下一篇
Linux mcookie 怎样从文件内容补充随机输入
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    809次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    798次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    889次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    860次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    687次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码