源代码: Lib/pprint.py
模块 pprint 提供了“整洁地打印”任意 Python 数据结构的能力,它的输出可以用作解释器的输入。如果被格式化的结构包括了非基本的Python类型对象,打印结果可能不能被解释器装载。包含了文件、套接字、类或者实例的对象都可能属于这种情况;其它许多无法表示成Python常量的内置对象也属于这种情况。
如果可能,打印结果在一行;如果超出了允许的宽度,它被断成多行。如果需要明确地调整宽度,构造 PrettyPrinter 对象。
改变于版本2.5:字典先按键排序,然后计算显示;在此之前,字典只在它的显示需要多行的情况下才被排序(这点没有文档记录)。
改变于版本2.6:添加了对 set 和 frozenset的支持。
模块 pprint 定义了类:
构造 PrettyPrinter 实例。构造器理解许多关键字参数。使用stream关键字可以设置输出流;在流对象上唯一使用的方法就是文件协议的 write() 方法。如果未指明, PrettyPrinter 使用 sys.stdout。其它三个参数可以用来控制打印结果。它们的关键字是 indent、depth和width。indent指明了每一级递归所增加的缩进量;默认值为一。其它值会导致输出看上去有点奇怪,但使得嵌套更容易识别。depth控制可以打印的级数;if the data structure being printed is too deep, the next contained level is replaced by ....默认对被打印对象的深度没有限制。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 类提供支持。
以字符串的形式返回object的打印结果。indent、 width 和 depth 被当作格式化参数,传递给 PrettyPrinter 构造器。
改变于版本2.4:添加了 indent、 width 和 depth 参数。
将object打印到stream中,结尾输出新行。如果 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 参数。
判断 object 的打印结果是否“可读”,或者能否用 eval()来重新构造值。对于递归对象它总是返回 False 。
>>> pprint.isreadable(stuff)
False
判断object是否需要递归打印。
还定义了一个支持函数:
返回object的字符串表示,对于递归的数据结构有保护。如果 object 的显示有递归的情况发生,递归的引用将会被表示成 <Recursion on typename with id=number>。显示不会被另外地格式化。
>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
PrettyPrinter 实例有以下方法:
返回object的格式化表示。它会考虑传给 PrettyPrinter 构造器的选项。
将object打印到流中,结尾输出新行 。
以下方法对对应的同名函数提供了实现。在实例上使用这些方法会更有效,因为不用创建新的 PrettyPrinter 对象。
判断对象的打印结果是否“可读”,或者能否用 eval()来重新构造值。注意对于递归对象它返回 False 。如果PrettyPrinter设置了depth参数且对象比参数深,它返回False。
判断对象是否需要递归打印。
这个方法是个钩子,子类可以修改它,从而改变对象转为字符串的方式。默认使用了 saferepr() 的实现。
返回三个值: object 格式化后的字符串,表明结果是否可读的标志位,表明是否检测到递归的标志位。第一个参数是需要转化的对象。第二个参数是个字典,它的键为对象的 id() ,这些对象构成了当前展示的上下文(影响展示的 object 的直接或者间接的容器);如果需啊哟展示的对象已经存在于 context中,第三个返回值为 True。递归调用 format() 方法会向这个字典中添加额外的容器条目。第三个参数 maxlevels指明了递归的限制;0 表示没有限制。递归调用时这个参数不改变。第四个参数 level指明了当前的(递归)级别;递归调用时它的值应该减少。
出现于版本2.3。
这个例子演示了 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']]