Skip to main content

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 实例。此构造函数了解几个关键字参数。可以使用 stream 关键字来设置输出流;在流对象上使用的唯一方法是文件协议的 write() 方法。如果没有指定,PrettyPrinter 采用 sys.stdout。每个递归级别添加的缩进量由 indent 指定;默认值为1。其他值可能导致输出看起来有点奇怪,但可以使嵌套更容易发现。可以打印的级数由 depth 控制;如果正在打印的数据结构太深,则下一个包含的级别将替换为 ...。默认情况下,对正在格式化的对象的深度没有约束。使用 width 参数限制所需的输出宽度;默认值为80个字符。如果结构不能在受约束的宽度内格式化,则将做出最大努力。如果 compact 为false(默认值),长序列的每个项目将在单独的行上格式化。如果 compact 为真,则在每个输出行上将格式化将适合 width 中的许多项目。

在 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 的格式化表示。 indentwidthdepthcompact 将作为格式化参数传递给 PrettyPrinter 构造函数。

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

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

stream 上打印 object 的格式化表示,后跟换行。如果 streamNone,则使用 sys.stdout。这可以在交互式解释器中使用,而不是用于检查值的 print() 功能(甚至可以重新分配 print = pprint.pprint 以在范围内使用)。 indentwidthdepthcompact 将作为格式化参数传递给 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() 重建值。请注意,这会为递归对象返回 False。如果设置了 PrettyPrinterdepth 参数,并且对象比所允许的深,则返回 False

PrettyPrinter.isrecursive(object)

确定对象是否需要递归表示。

此方法作为一个钩子提供,允许子类修改对象转换为字符串的方式。默认实现使用 saferepr() 实现的内部。

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

返回三个值:作为字符串的 object 的格式化版本,指示结果是否可读的标志,以及指示是否检测到递归的标志。第一个参数是要呈现的对象。第二个是包含作为当前呈现上下文(作为影响呈现的 object 的直接和间接容器)的一部分的对象的 id() 作为密钥的字典;如果需要呈现已经在 context 中表示的对象,则第三返回值应该是 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': 'glyph@twistedmatrix.com',
          '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'}]}

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

>>> pprint.pprint(project_info, depth=2)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          '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': [{...}, {...}]}

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

>>> pprint.pprint(project_info, depth=2, width=50)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          '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': [{...}, {...}]}