On this page
8.18. pprint-数据漂亮的打印机
源代码: Lib/pprint.py
pprint模块提供了一种以可以用作解释器 Importing 的形式“漂亮地打印”任意 Python 数据结构的Function。如果格式化的结构包含不是基本 Python 类型的对象,则表示可能无法加载。如果包括诸如文件,套接字,类或实例之类的对象,以及许多其他无法用 Python 常量表示的内置对象,则可能是这种情况。
如果可以的话,格式化的表示形式会将对象保留在一行上,如果对象超出允许的宽度,则将它们分成多行。如果需要调整宽度约束,则显式构造PrettyPrinter对象。
在版本 2.5 中进行了更改:在计算显示之前,词典按键排序;在 2.5 之前的版本中,仅在字典显示需要多行的情况下才对字典进行排序,尽管没有记录。
在 2.6 版中进行了更改:添加了对set和frozenset的支持。
pprint模块定义了一个类别:
-
- class *
pprint.
PrettyPrinter
(* indent = 1 , width = 80 , depth = None , stream = None *)
- 构造一个PrettyPrinter实例。该构造函数可以理解几个关键字参数。可以使用* stream 关键字设置输出流;流对象上使用的唯一方法是文件协议的
write()
方法。如果未指定,则PrettyPrinter采用sys.stdout
。可以使用三个附加参数来控制格式化的表示形式。关键字是 indent , depth 和 width 。为每个递归级别添加的缩进量由 indent 指定;默认值为 1.其他值可能会使输出看起来有些奇怪,但会使嵌套更容易发现。可以打印的级别数由 depth 控制;如果要打印的数据结构太深,则将下一个包含的级别替换为...
。默认情况下,对要格式化的对象的深度没有限制。所需的输出宽度使用 width *参数进行限制;默认值为 80 个字符。如果无法在限制的宽度内格式化结构,则将尽力而为。
- class *
>>> 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构造函数。
- 在* stream 上打印 object 的格式化表示形式,后跟换行符。如果 stream *是
>>> 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
。
- 确定* object *的格式表示形式是“可读的”,还是可以用于使用eval()重构值。对于递归对象,它总是返回
>>> pprint.isreadable(stuff)
False
pprint.
isrecursive
(* object *)- 确定* object *是否需要递归表示。
还定义了另一种支持Function:
pprint.
saferepr
(* object *)- 返回* object 的字符串表示形式,以防止递归数据结构。如果 object *的表示形式公开了递归项,则递归引用将表示为
<Recursion on typename with id=number>
。该表示未进行其他格式化。
- 返回* object 的字符串表示形式,以防止递归数据结构。如果 object *的表示形式公开了递归项,则递归引用将表示为
>>> 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 *的表示形式,然后换行。
以下方法提供了具有相同名称的相应Function的实现。由于不需要创建新的PrettyPrinter对象,因此在实例上使用这些方法的效率稍高。
PrettyPrinter.
isreadable
(* object *)- 确定对象的格式化表示形式是“可读的”,还是可以使用eval()来重构该值。请注意,这将为递归对象返回
False
。如果设置了PrettyPrinter的* depth *参数,并且对象的深度超出允许范围,则返回False
。
- 确定对象的格式化表示形式是“可读的”,还是可以使用eval()来重构该值。请注意,这将为递归对象返回
PrettyPrinter.
isrecursive
(* object *)- 确定对象是否需要递归表示。
该方法作为一个钩子提供,以允许子类修改将对象转换为字符串的方式。默认实现使用saferepr()实现的内部。
PrettyPrinter.
format
(* object , context , maxlevels , level *)
2.3 版的新Function。
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']]