文章目录(Table of Contents)
简介
默认 Python 中的 print 打印的结果可能不够美观,同时打印「字典」等数据类型的时候不会有层级关系。为了让输出更加好看,可以尝试使用 PrettyPrinter
。
PrettyPrinter
适用于 Python 3.5+ 的语法高亮。他是对 pprint 的改进,尽力产生漂亮的输出。下面是 PrettyPrinter 的演示截图:
参考资料
- PrettyPrinter Document Usage,PrettyPrinter 的官方说明文档(以下内容主要参考本文);
- PrettyPrinter -- Github,PrettyPrinter 的 Github 链接;
- Python 的第三方打印类库 —— PrettyPrinter
PrettyPrinter 的使用
首先需要安装 prettyprinter
库,使用 pip
来进行安装:
pip install prettyprinter
接着只需要在使用的时候 import
即可。使用 cpprint
可以有颜色的输出:
- from prettyprinter import cpprint
而将 c
去掉的 pprint
则是没有颜色:
- from prettyprinter import pprint
在 Python 代码中使用 PrettyPrinter
我们可以使用 cpprint
来获得带有颜色的输出。例如下面的例子我们将一个字典(dict)用较好的样式显示出来:
- from prettyprinter import cpprint
- t_dict = {
- 'a':{1:[1,2,3],2:[4,5,6],3:[7,8,9]},
- 'b':[10,11,12],
- 'c':[13,14,15]}
- cpprint(t_dict)
最终的显示效果如下所示,层级关系都是很清楚的,同时也加上了颜色:
上面默认的样式是深色模式(dark),可以使用下面的方式将样式调整为浅色模式(light):
- from prettyprinter import set_default_style
- set_default_style('light')
对 Numpy 数据进行高亮
我们可以通过 prettyprinter.install_extras
来为第三方库注册 prettyprinter。目前支持的有'ipython', 'ipython_repr_pretty', 'django', 'python', 'dataclasses', 'numpy', 'attrs', 'requests'(关于这部分可以查看 PrettyPrinter -- API Rederence 查看更加详细的说明)。
例如下面我们为 numpy 来注册,同时设置打印的宽度(在 cpprint 中设置 width 即可),并查看最终的效果:
- import prettyprinter
- import numpy as np
- prettyprinter.install_extras(['numpy'])
- a = np.array([[1,2,3,0],
- [4,5,6,0],
- [7,8,9,0]])
- prettyprinter.cpprint(a, width=30)
最终效果如下图所示,可以看到打印的结果有了颜色高亮:
对自定义类设计样式
我们可以对自定义类注册 pretty printer。我们定义一个类:
- class MyClass(object):
- def __init__(self, one, two):
- self.one = one
- self.two = two
接着都该类进行注册 pretty printer
,后面在打印的时候就会出现样式:
- import prettyprinter
- from prettyprinter import register_pretty, pretty_call, comment
- @register_pretty(MyClass)
- def pretty_myclass(value, ctx):
- print(ctx)
- return pretty_call(
- ctx,
- MyClass,
- one=value.one,
- two=value.two
- )
之后我们直接类实例化,然后进行打印:
- a = {'abc': 1, 'defg': 2, 'hijk': 3}
- b = [1, 2]
- myclass = MyClass(a, b)
- # 打印
- prettyprinter.cpprint(myclass)
最终打印的结果如下所示:
打印的时候加上 comment
有的时候我们在打印的时候希望加上一些注释。例如现在有一个类描述链接的状态,有 Open 和 Close 这两种状态:
- class Connection(object):
- def __init__(self, hostname):
- self.hostname = hostname
- self.is_open = False
- def open(self):
- self.is_open = True
- def close(self):
- self.is_open = False
我们可以对该类注册 pretty printer
,同时使用 prettyprinter.comment
可以在打印结果后面加上注释,例如 Status: Open
或是 Status: Close
。
- import prettyprinter
- from prettyprinter import register_pretty, pretty_call, comment
- @register_pretty(Connection)
- def pretty_connection(value, ctx):
- if value.is_open == True:
- status_text = 'Status: Open'
- else:
- status_text = 'Status: Close'
- return comment(
- pretty_call(
- ctx,
- Connection,
- hostname=value.hostname),
- status_text
- )
- # 实例化类,并进行打印
- c = Connection('mathpretty.com')
- c.open() # 打开链接
- prettyprinter.cpprint(c)
- c.close() # 关闭
- prettyprinter.cpprint(c)
最终的结果如下所示,可以看到在打开和关闭情况下,打印会在最后有一个注释:
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论