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中,结尾输出新行。如果 stream 为
None
,使用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()
来重新构造值。注意对于递归对象它返回False
。If the depth parameter of thePrettyPrinter
is set and the object is deeper than allowed, this returnsFalse
.
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': [{...}, {...}]}