pprint
pprint — Data pretty printer
源代码:
Lib / pprint.py
该pprint
模块提供了以可以用作解释器输入的形式“漂亮地”打印任意Python数据结构的能力。如果格式化结构包含不是基本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
。可以使用三个附加参数来控制格式化表示。关键字是缩进
,深度
和宽度
。为每个递归级别添加的缩进
量由缩进
指定; 默认值是1。其他值可能会导致输出看起来有点奇怪,但可以使嵌套更容易找到。可以打印的层数由深度
控制; 如果正在打印的数据结构太深,则下一个包含的级别将被替换为...
。默认情况下,格式化对象的深度
没有限制。所需的输出宽度
使用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)
以字符串形式返回对象
的格式化表示。缩进
,宽度
和深度
将PrettyPrinter
作为格式参数传递给构造函数。
在版本2.4中更改:添加了参数缩进
,宽度
和深度
。
pprint.pprint(object, stream=None, indent=1, width=80, depth=None)
打印正在流中
的对象
的格式化表示,然后是换行符。如果流
是,使用。这可以在交互式解释器中使用,而不是用于检查值的语句。缩进
,宽度
和深度
将作为格式参数传递给构造函数。Nonesys.stdoutprintPrettyPrinter
>>> 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中更改:添加了参数缩进
,宽度
和深度
。
pprint.isreadable(object)
确定对象
的格式化表示是“可读的”,还是可以用来重构使用的值eval()
。这总是返回False
递归对象
。
>>> pprint.isreadable(stuff)
False
pprint.isrecursive(object)
确定对象是否
需要递归表示。
还定义了一个支持功能:
pprint.saferepr(object)
返回对象的字符串表示形式,保护对象不受递归数据结构的影响。如果对象的表示公开递归条目,则递归引用将被表示为<Recursion on typename with id=number>。该表示不是格式化的。
>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
1. PrettyPrinter对象
PrettyPrinter
实例具有以下方法:
PrettyPrinter.pformat(object)
返回对象
的格式化表示。这考虑到传递给PrettyPrinter
构造函数的选项。
PrettyPrinter.pprint(object)
在配置的流上打印对象
的格式化表示,然后是换行符。
以下方法提供了相同名称的相应功能的实现。由于PrettyPrinter
不需要创建新对象,因此在实例上使用这些方法稍微有效一些。
PrettyPrinter.isreadable(object)
确定对象的格式化表示是“可读的”,还是可用于重构使用的值eval()
。请注意,这将返回False
递归对象。如果设置了深度
参数PrettyPrinter
并且对象比允许的深度
更深,则返回False
。
PrettyPrinter.isrecursive(object)
确定对象是否需要递归表示。
该方法作为钩子提供,允许子类修改对象转换为字符串的方式。默认实现使用实现的内部saferepr()
。
PrettyPrinter.format(object, context, maxlevels, level)
返回三个值:作为字符串的对象的
格式化版本,指示结果是否可读的标志以及指示是否检测到递归的标志。第一个参数是要呈现的对象
。第二个是一个字典,它包含作为id()
当前表示上下文的一部分的对象
(影响该表示的对象的
直接和间接容器)作为关键字; 如果需要呈现的对象
已经在上下文中
表示,则第三个返回值应该是True
。递归调用format()
方法应该为容器添加额外的条目到这个字典。第三个参数,maxlevels
,给出了递归的请求限制; 这将是0
如果没有要求的限制。这个参数应该不加修改地传递给递归调用。第四个参数,水平
,给出当前的水平
; 递归调用应该传递一个小于当前调用的值。
2.3版本的新功能。
实施例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']]