8.11. pprint - 数据漂亮打印机

源代码: Lib/pprint.py

模块 pprint 提供了“整洁地打印”任意 Python 数据结构的能力,它的输出可以用作解释器的输入。如果被格式化的结构包括了非基本的Python类型对象,打印结果可能不能被解释器装载。如果包括诸如文件,套接字或类的对象,以及许多其他不能表示为Python字面值的对象,则可能是这种情况。

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

在计算显示之前,按键对字典进行排序。

模块 pprint 定义了类:

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

构造 PrettyPrinter 实例。构造器理解许多关键字参数。可以使用关键字设置输出流;对流对象使用的唯一方法是文件协议的write()方法。如果未指明, PrettyPrinter 使用 sys.stdout每个递归级别添加的缩进量由缩进指定;默认值为1。其它值会导致输出看上去有点奇怪,但使得嵌套更容易识别。可以打印的级别数量由深度控制;如果正在打印的数据结构太深,则下一个包含的级别将替换为...。默认情况下,对正在格式化的对象的深度没有约束。使用width参数限制所需的输出宽度;默认值为80个字符。如果结构不能被格式化到指定宽度内,打印器将做最大努力。如果compact为false(默认值),长序列的每个项目将在单独的行上格式化。如果compact为真,则在每个输出行上将格式化将适合宽度内的项目数。

在版本3.4中已更改:添加了compact参数。

>>> 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']
>>> pp = pprint.PrettyPrinter(width=41, compact=True)
>>> 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', (...)))))))

pprint模块还提供了几个快捷方式功能:

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

以字符串的形式返回object的打印结果。缩进宽度深度compact将传递到PrettyPrinter格式化参数。

在版本3.4中已更改:添加了compact参数。

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

object打印到stream中,结尾输出新行。如果 streamNone,使用 sys.stdout这可以在交互式解释器中使用,而不是用于检查值的print()函数(您甚至可以重新分配print = pprint.pprint以在范围内使用)。缩进宽度深度compact将传递到PrettyPrinter格式化参数。

在版本3.4中已更改:添加了compact参数。

>>> 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']
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.11.1.PrettyPrinter对象

PrettyPrinter 实例有以下方法:

PrettyPrinter.pformat(object)

返回object的格式化表示。它会考虑传给 PrettyPrinter 构造器的选项。

PrettyPrinter.pprint(object)

object打印到流中,结尾输出新行 。

以下方法对对应的同名函数提供了实现。在实例上使用这些方法会更有效,因为不用创建新的 PrettyPrinter 对象。

PrettyPrinter.isreadable(object)

判断对象的打印结果是否“可读”,或者能否用 eval()来重新构造值。注意对于递归对象它返回 FalseIf the depth parameter of the PrettyPrinter is set and the object is deeper than allowed, this returns False.

PrettyPrinter.isrecursive(object)

判断对象是否需要递归打印。

这个方法是个钩子,子类可以修改它,从而改变对象转为字符串的方式。默认使用了 saferepr() 的实现。

PrettyPrinter.format(object, context, maxlevels, level)

返回三个值: object 格式化后的字符串,表明结果是否可读的标志位,表明是否检测到递归的标志位。第一个参数是需要转化的对象。第二个是包含作为当前呈现上下文(对影响呈现的对象的直接和间接容器)的一部分的对象的id()的字典,作为键;如果需要呈现已经在上下文中表示的对象,则第三返回值应该是True递归调用 format() 方法会向这个字典中添加额外的容器条目。第三个参数,maxlevels,给出了递归的请求限制;如果没有请求的限制,这将是0递归调用时这个参数不改变。第四个参数,level,给出当前级别;递归调用应传递的值小于当前调用的值。

8.11.2.示例

为了演示pprint()函数及其参数的多种用途,让我们从PyPI获取有关项目的信息:

>>> import json
>>> import pprint
>>> from urllib.request import urlopen
>>> with urlopen('http://pypi.python.org/pypi/Twisted/json') as url:
...     http_info = url.info()
...     raw_data = url.read().decode(http_info.get_content_charset())
>>> project_info = json.loads(raw_data)

在其基本形式中,pprint()显示整个对象:

>>> pprint.pprint(project_info)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': '[email protected]',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': ['Programming Language :: Python :: 2.6',
                          'Programming Language :: Python :: 2.7',
                          'Programming Language :: Python :: 2 :: Only'],
          'description': 'An extensible framework for Python programming, with '
                         'special focus\r\n'
                         'on event-based network programming and multiprotocol '
                         'integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous networking framework written in Python',
          'version': '12.3.0'},
 'urls': [{'comment_text': '',
           'downloads': 71844,
           'filename': 'Twisted-12.3.0.tar.bz2',
           'has_sig': False,
           'md5_digest': '6e289825f3bf5591cfd670874cc0862d',
           'packagetype': 'sdist',
           'python_version': 'source',
           'size': 2615733,
           'upload_time': '2012-12-26T12:47:03',
           'url': 'https://pypi.python.org/packages/source/T/Twisted/Twisted-12.3.0.tar.bz2'},
          {'comment_text': '',
           'downloads': 5224,
           'filename': 'Twisted-12.3.0.win32-py2.7.msi',
           'has_sig': False,
           'md5_digest': '6b778f5201b622a5519a2aca1a2fe512',
           'packagetype': 'bdist_msi',
           'python_version': '2.7',
           'size': 2916352,
           'upload_time': '2012-12-26T12:48:15',
           'url': 'https://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.3.0.win32-py2.7.msi'}]}

结果可以限于某个深度(省略号用于更深的内容):

>>> pprint.pprint(project_info, depth=2)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': '[email protected]',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': [...],
          'description': 'An extensible framework for Python programming, with '
                         'special focus\r\n'
                         'on event-based network programming and multiprotocol '
                         'integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous networking framework written in Python',
          'version': '12.3.0'},
 'urls': [{...}, {...}]}

此外,可以建议最大字符宽度如果长对象不能拆分,将超出指定的宽度:

>>> pprint.pprint(project_info, depth=2, width=50)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': '[email protected]',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': [...],
          'description': 'An extensible '
                         'framework for Python '
                         'programming, with '
                         'special focus\r\n'
                         'on event-based network '
                         'programming and '
                         'multiprotocol '
                         'integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous networking '
                     'framework written in '
                     'Python',
          'version': '12.3.0'},
 'urls': [{...}, {...}]}