pprint比print更适合看嵌套数据,因其自动换行、缩进对齐、字典键默认字母排序,使层级结构一目了然;支持width、indent、depth等参数精细控制输出,并能处理任意python对象(含循环引用),而print仅单行输出、无格式化能力。

pprint 为什么比 print 更适合看嵌套数据
直接用 print() 打印 dict 套 list 再套 dict,往往挤成一行、缩进混乱、键值对对不齐,根本看不出结构。而 pprint(pretty-print)专为可读性设计:自动换行、缩进对齐、按字母序排字典键(默认),让嵌套层级一目了然。
它不改变数据,只改变输出格式——这点和 json.dumps(..., indent=2) 类似,但 pprint 能处理任意 Python 对象(包括自定义类、函数、循环引用),json 则只认基本类型且会报错。
控制缩进、宽度和深度的关键参数
pprint 的核心是 pprint.pprint() 函数,三个常用参数直接影响调试体验:
-
width:单行最大字符数,默认 80。调大(如width=120)可减少不必要的换行,尤其适合宽屏终端 -
indent:每级缩进空格数,默认 1。设为indent=4更符合 PEP 8 风格,和代码缩进一致 -
depth:限制打印深度,超出部分显示为[...]。调试超深嵌套时加depth=3能快速聚焦顶层结构
示例:
from pprint import pprint
data = {"users": [{"id": 1, "profile": {"name": "Alice", "tags": ["dev", "py"]}}, {"id": 2, "profile": {"name": "Bob"}}]}
pprint(data, width=100, indent=4, depth=2)输出中 "profile" 字典会被折叠成 {...},避免刷屏。
避免意外排序导致的调试干扰
pprint 默认对字典键排序(sort_dicts=True),这会让原始插入顺序消失。如果业务逻辑依赖键序(比如某些 API 响应或配置字典),排序后可能掩盖问题。
解决方法很简单:
pprint(data, sort_dicts=False)Python 3.8+ 支持该参数;旧版本需用
pprint.PrettyPrinter(sort_dicts=False).pprint(data)。
注意:即使关掉排序,pprint 仍会把 dict 和 set 显示为花括号形式,别误以为是 JSON——它原样保留 Python 语法特征(比如 True 不是 true)。
什么时候不该用 pprint?
不是所有场景都适合:
- 需要复制粘贴到 JSON 文件或 HTTP 请求体时,用
json.dumps(obj, indent=2)更稳妥(pprint输出含单引号、None、True等非 JSON 语法) - 日志中长期存档结构化数据时,避免用
pprint——它输出带空格缩进,解析困难;改用repr()或序列化格式 - 对象含大量不可序列化内容(如文件句柄、线程锁)时,
pprint可能卡住或抛RecursionError,此时先用vars(obj)或obj.__dict__提取关键字段再打印
真正要盯住的是:你此刻想确认什么——是结构形状?键名拼写?还是某一层的具体值?选工具前先问清楚这个,比记住所有参数更重要。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











