Python 第三方打印库 PrettyPrinter

王 茂南 2021年10月13日07:31:54
评论
2827字阅读9分25秒
摘要本文介绍一个 Python 的第三方的打印库 PrettyPrinter,可以使得打印的结果更加好看,更加有结构化。

简介

默认 Python 中的 print 打印的结果可能不够美观,同时打印「字典」等数据类型的时候不会有层级关系。为了让输出更加好看,可以尝试使用 PrettyPrinter

PrettyPrinter适用于 Python 3.5+ 的语法高亮。他是对 pprint 的改进,尽力产生漂亮的输出。下面是 PrettyPrinter 的演示截图:

Python 第三方打印库 PrettyPrinter

参考资料

 

PrettyPrinter 的使用

首先需要安装 prettyprinter 库,使用 pip 来进行安装:

pip install prettyprinter

接着只需要在使用的时候 import 即可。使用 cpprint 可以有颜色的输出:

  1. from prettyprinter import cpprint

而将 c 去掉的 pprint 则是没有颜色:

  1. from prettyprinter import pprint

 

在 Python 代码中使用 PrettyPrinter

我们可以使用 cpprint 来获得带有颜色的输出。例如下面的例子我们将一个字典(dict)用较好的样式显示出来:

  1. from prettyprinter import cpprint
  2. t_dict = {
  3.     'a':{1:[1,2,3],2:[4,5,6],3:[7,8,9]},
  4.     'b':[10,11,12],
  5.     'c':[13,14,15]}
  6. cpprint(t_dict)

最终的显示效果如下所示,层级关系都是很清楚的,同时也加上了颜色:

Python 第三方打印库 PrettyPrinter

上面默认的样式是深色模式(dark),可以使用下面的方式将样式调整为浅色模式(light)

  1. from prettyprinter import set_default_style
  2. 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 即可),并查看最终的效果:

  1. import prettyprinter
  2. import numpy as np
  3. prettyprinter.install_extras(['numpy'])
  4. a = np.array([[1,2,3,0],
  5.               [4,5,6,0],
  6.               [7,8,9,0]])
  7. prettyprinter.cpprint(a, width=30)

最终效果如下图所示,可以看到打印的结果有了颜色高亮:

Python 第三方打印库 PrettyPrinter

 

对自定义类设计样式

我们可以对自定义类注册 pretty printer。我们定义一个类:

  1. class MyClass(object):
  2.     def __init__(self, one, two):
  3.         self.one = one
  4.         self.two = two

接着都该类进行注册 pretty printer,后面在打印的时候就会出现样式:

  1. import prettyprinter
  2. from prettyprinter import register_pretty, pretty_call, comment
  3. @register_pretty(MyClass)
  4. def pretty_myclass(value, ctx):
  5.     print(ctx)
  6.     return pretty_call(
  7.         ctx,
  8.         MyClass,
  9.         one=value.one,
  10.         two=value.two
  11.     )

之后我们直接类实例化,然后进行打印:

  1. a = {'abc': 1, 'defg': 2, 'hijk': 3}
  2. b = [1, 2]
  3. myclass = MyClass(a, b)
  4. # 打印
  5. prettyprinter.cpprint(myclass)

最终打印的结果如下所示:

Python 第三方打印库 PrettyPrinter

 

打印的时候加上 comment

有的时候我们在打印的时候希望加上一些注释。例如现在有一个类描述链接的状态,有 Open 和 Close 这两种状态:

  1. class Connection(object):
  2.     def __init__(self, hostname):
  3.         self.hostname = hostname
  4.         self.is_open = False
  5.     def open(self):
  6.         self.is_open = True
  7.     def close(self):
  8.         self.is_open = False

我们可以对该类注册 pretty printer,同时使用 prettyprinter.comment 可以在打印结果后面加上注释,例如 Status: Open 或是 Status: Close

  1. import prettyprinter
  2. from prettyprinter import register_pretty, pretty_call, comment
  3. @register_pretty(Connection)
  4. def pretty_connection(value, ctx):
  5.     if value.is_open == True:
  6.         status_text = 'Status: Open'
  7.     else:
  8.         status_text = 'Status: Close'
  9.     return comment(
  10.         pretty_call(
  11.             ctx,
  12.             Connection,
  13.             hostname=value.hostname),
  14.         status_text
  15.         )
  16. # 实例化类,并进行打印
  17. c = Connection('mathpretty.com')
  18. c.open() # 打开链接
  19. prettyprinter.cpprint(c)
  20. c.close() # 关闭
  21. prettyprinter.cpprint(c)

最终的结果如下所示,可以看到在打开和关闭情况下,打印会在最后有一个注释:

Python 第三方打印库 PrettyPrinter

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2021年10月13日07:31:54
  • 转载请务必保留本文链接:https://mathpretty.com/14147.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: