在线文档教程

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']]