8.18. pprint打印整洁的数据

源代码: Lib/pprint.py


模块 pprint 提供了“整洁地打印”任意 Python 数据结构的能力,它的输出可以用作解释器的输入。如果被格式化的结构包括了非基本的Python类型对象,打印结果可能不能被解释器装载。包含了文件、套接字、类或者实例的对象都可能属于这种情况;其它许多无法表示成Python常量的内置对象也属于这种情况。

如果可能,打印结果在一行;如果超出了允许的宽度,它被断成多行。如果需要明确地调整宽度,构造 PrettyPrinter 对象。

改变于版本2.5:字典先按键排序,然后计算显示;在此之前,字典只在它的显示需要多行的情况下才被排序(这点没有文档记录)。

改变于版本2.6:添加了对 setfrozenset的支持。

模块 pprint 定义了类:

class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None)

构造 PrettyPrinter 实例。构造器理解许多关键字参数。使用stream关键字可以设置输出流;在流对象上唯一使用的方法就是文件协议的 write() 方法。如果未指明, PrettyPrinter 使用 sys.stdout其它三个参数可以用来控制打印结果。它们的关键字是 indentdepthwidthindent指明了每一级递归所增加的缩进量;默认值为一。其它值会导致输出看上去有点奇怪,但使得嵌套更容易识别。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 类提供支持。

pprint.pformat(object, indent=1, width=80, depth=None)

以字符串的形式返回object的打印结果。indentwidthdepth 被当作格式化参数,传递给 PrettyPrinter 构造器。

改变于版本2.4:添加了 indentwidthdepth 参数。

pprint.pprint(object, stream=None, indent=1, width=80, depth=None)

object打印到stream中,结尾输出新行。如果 streamNone,使用 sys.stdout这个可以在交互式解释器中替代 print 语句,用以检查变量的值。indentwidthdepth 被当作格式化参数,传递给 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:添加了 indentwidthdepth 参数。

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 例子

这个例子演示了 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']]

目录

上一页

8.17. copy — 浅拷贝和深拷贝操作

下一页

8.19. repr — Alternate repr() implementation

当前页