8.18. pprint — 数据漂亮打印机 — Python 文档
8.18. 打印 — 数据漂亮的打印机
pprint 模块提供了一种以可用作解释器输入的形式“漂亮地打印”任意 Python 数据结构的功能。 如果格式化结构包含不是基本 Python 类型的对象,则表示可能无法加载。 如果包含文件、套接字、类或实例等对象,以及许多其他无法表示为 Python 常量的内置对象,则可能会出现这种情况。
如果可以,格式化表示将对象保留在一行上,如果它们不适合允许的宽度,则将它们分成多行。 如果需要调整宽度约束,请显式构造 PrettyPrinter 对象。
2.5 版本更改: 字典在计算显示前按关键字排序; 在 2.5 之前,仅当字典的显示需要多于一行时才对其进行排序,尽管没有记录。
pprint 模块定义了一个类:
- class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None)
构造一个 PrettyPrinter 实例。 这个构造函数理解几个关键字参数。 可以使用 stream 关键字设置输出流; 流对象上使用的唯一方法是文件协议的
write()
方法。 如果不指定,PrettyPrinter采用sys.stdout
。 可以使用三个附加参数来控制格式化表示。 关键字是 indent、depth 和 width。 每个递归级别添加的缩进量由 indent 指定; 默认为一。 其他值可能会导致输出看起来有点奇怪,但可以使嵌套更容易发现。 可打印的层数由depth控制; 如果正在打印的数据结构太深,则下一个包含的级别将替换为...
。 默认情况下,对正在格式化的对象的深度没有限制。 使用 width 参数限制所需的输出宽度; 默认值为 80 个字符。 如果结构无法在受约束的宽度内格式化,则将尽最大努力。>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff[:]) >>> pp = pprint.PrettyPrinter(indent=4) >>> pp.pprint(stuff) [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], 'spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', ... ('parrot', ('fresh fruit',)))))))) >>> pp = pprint.PrettyPrinter(depth=6) >>> pp.pprint(tup) ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
PrettyPrinter 类支持几个派生函数:
- pprint.pformat(object, indent=1, width=80, depth=None)
将 object 的格式化表示作为字符串返回。 indent、width 和 depth 将作为格式参数传递给 PrettyPrinter 构造函数。
2.4 版本变更: 增加了参数 indent、width 和 depth。
- pprint.pprint(object, stream=None, indent=1, width=80, depth=None)
在 stream 上打印 object 的格式化表示,后跟换行符。 如果 stream 是
None
,则使用sys.stdout
。 这可以在交互式解释器中使用,而不是用于检查值的 print 语句。 indent、width 和 depth 将作为格式参数传递给 PrettyPrinter 构造函数。>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) >>> pprint.pprint(stuff) [<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']
2.4 版本变更: 增加了参数 indent、width 和 depth。
- pprint.isreadable(object)
确定 object 的格式化表示是否“可读”,或可用于使用 eval() 重构值。 对于递归对象,这总是返回
False
。>>> pprint.isreadable(stuff) False
- pprint.isrecursive(object)
- 确定 object 是否需要递归表示。
还定义了另一个支持函数:
- pprint.saferepr(object)
返回 object 的字符串表示,防止递归数据结构。 如果 object 的表示公开了递归条目,则递归引用将表示为
<Recursion on typename with id=number>
。 该表示没有以其他方式格式化。>>> pprint.saferepr(stuff) "[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
8.18.1. PrettyPrinter 对象
PrettyPrinter 实例有以下方法:
- PrettyPrinter.pformat(object)
- 返回 object 的格式化表示。 这考虑了传递给 PrettyPrinter 构造函数的选项。
- PrettyPrinter.pprint(object)
- 在配置的流上打印 object 的格式化表示,后跟换行符。
以下方法提供了对应的同名函数的实现。 由于不需要创建新的 PrettyPrinter 对象,在实例上使用这些方法会稍微高效一些。
- PrettyPrinter.isreadable(object)
- 确定对象的格式化表示是否“可读”,或者是否可用于使用 eval() 重建值。 请注意,这为递归对象返回
False
。 如果设置了 PrettyPrinter 的 depth 参数并且对象比允许的深,则返回False
。
- PrettyPrinter.isrecursive(object)
- 确定对象是否需要递归表示。
此方法作为一个钩子提供,以允许子类修改对象转换为字符串的方式。 默认实现使用 saferepr() 实现的内部结构。
- PrettyPrinter.format(object, context, maxlevels, level)
返回三个值:作为字符串的 object 的格式化版本、指示结果是否可读的标志以及指示是否检测到递归的标志。 第一个参数是要呈现的对象。 第二个是一个字典,其中包含作为当前表示上下文一部分的对象的 id()(影响表示的 object 的直接和间接容器)作为键; 如果需要呈现已经在context中表示的对象,则第三个返回值应该是
True
。 对 format() 方法的递归调用应将容器的其他条目添加到此字典中。 第三个参数 maxlevels 给出了递归的请求限制; 如果没有要求的限制,这将是0
。 这个参数应该不加修改地传递给递归调用。 第四个参数 level 给出当前级别; 递归调用应该传递一个小于当前调用的值。2.3 版中的新功能。
8.18.2. 打印示例
此示例演示了 pprint() 函数及其参数的几种用法。
>>> import pprint
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> stuff = ['a' * 10, tup, ['a' * 30, 'b' * 30], ['c' * 20, 'd' * 20]]
>>> pprint.pprint(stuff)
['aaaaaaaaaa',
('spam',
('eggs',
('lumberjack',
('knights', ('ni', ('dead', ('parrot', ('fresh fruit',)))))))),
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
['cccccccccccccccccccc', 'dddddddddddddddddddd']]
>>> pprint.pprint(stuff, depth=3)
['aaaaaaaaaa',
('spam', ('eggs', (...))),
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
['cccccccccccccccccccc', 'dddddddddddddddddddd']]
>>> pprint.pprint(stuff, width=60)
['aaaaaaaaaa',
('spam',
('eggs',
('lumberjack',
('knights',
('ni', ('dead', ('parrot', ('fresh fruit',)))))))),
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
['cccccccccccccccccccc', 'dddddddddddddddddddd']]