当前位置: 首页 > 后端技术 > Python

如何美化Python对象?这个标准库很容易实现

时间:2023-03-26 17:07:03 Python

前不久写了一篇回顾print在Python中的发展历史的文章,提到了两条发展线索:明显:早期的print语句有C和Shell的影子,是应用级别声明,前十年经历了PEP-214和PEP-259的改进;然后在2009年的3.0大版本中,语句改成了print()函数,在3.3版本中做了一次功能增强,最终上升为一级内置函数。HiddenLine:介绍print的竞争者,比如传统的日志记录模块logging,调试模块pdb,主流IDE的调试功能,以及后起之秀PySnooper。这篇文章还是和print有关,而我要介绍的是标准库中的pprint模块。(未经授权请勿转载,文章首发于:https://mp.weixin.qq.com/s/d1...)pprint是“prettyprinter”的简称,“pretty”的意思是“漂亮,漂亮”,而“相当”的程度,所以它的意思是:(相当)漂亮的印刷。这是一个相当简单但有用的模块,主要用于打印复杂的数据结构对象,例如多级嵌套列表、元组和字典。我们来看一个print()打印的例子:mylist=["Beautifulisbetterthanugly.","Explicitisbetterthanimplicit.","Simpleisbetterthancomplex.","Complexisbetterthancomplicated."]print(mylist)#结果如下:['美丽胜于丑陋。','明确胜于隐含。','简单胜于复杂。','复杂胜于复杂。']这是一个简单的示例,全部打印在一行上。想象一下,如果对象中的元素是多层嵌套的内容(比如复杂的Json数据),或者元素太多(比如列表中存储了很多的URL链接),然后打印出来呢?那一定是一团糟而且不容易阅读。使用pprint模块的pprint()代替print()可以解决以下痛点:设置合适的线宽,做合适的换行,设置打印的缩进和层级,进行格式化打印,判断是否死循环1.简单使用语法:pprint(object,stream=None,indent=1,width=80,depth=None,*,compact=False)默认线宽参数为80,当打印字符(character)小于80个,pprint()基本等同于内置函数print()。当字符超过时,它会美化并格式化输出:importpprint#printmylist上例中的pprint.pprint(mylist)#打印的元素是换行符(因为超过了80个字符):['美丽胜于丑陋。','明确优于隐含。','简单优于复杂。','复杂优于复杂。']2.将缩进设置为4个空格(默认为1)pprint.pprint(mylist,indent=4)['Beautifulisbetterthanugly.','Explicitisbetterthanimplicit.','Simpleisbetterthancomplex.','Complexisbetterthancomplicated.']3.设置打印线宽mydict={'students':[{'name':'Tom','age':18},{'name':'Jerry','age':19}]}pprint.pprint(mydict)#不要太长:{'students':[{'age':18,'name':'Tom'},{'age':19,'name':'Jerry'}]}pprint.pprint(mydict,width=20)#超长1:{'学生':[{'年龄':18,'姓名':'Tom'},{'age':19,'name':'Jerry'}]}pprint.pprint(mydict,width=70)#超长2:{'students':[{'age':18,'name':'Tom'},{'age':19,'name':'Jerry'}]}4.设置打印级别(默认全打印)newlist=[1,[2,[3,[4],[5]]]]]pprint.pprint(newlist,depth=3)#超出的层级将用...[1,[2,[3,[...]]]]5.优化theloopstructurePrinting当循环引用出现在列表或其他数据结构中时,不可能把所有的内容都打印出来,所以简化打印,就像上面的例子一样,只打印外壳,不打印内层循环印刷的东西。这种处理方式简化了,但是没有指出是谁造成了循环,容易漏掉。pprint()方法已得到改进。当遇到死循环结构时,会用的格式表示。还有一个saferepr()方法,也是这样优化的,返回一个字符串:newlist=[1,2]newlist.insert(0,newlist)#列表元素指向列表本身,造成循环reference#直接打印的结果是:[[...],1,2]pprint.pprint(newlist)#[,1,2]pprint.saferepr(newlist)#'[,1,2]'6。判断一个对象是否存在死循环有两种判断循环结构的方法:判断格式化后的内容是否可以通过eval()重构。以上是对pprint模块的快速介绍。此外,还有pformat()方法、PrettyPrinter类和某些参数的使用。我觉得用处不大,就不多说了。有兴趣的可以参考:官方介绍:https://docs.python.org/zh-cn...源码地址:https://github.com/python/cpy...最后,还有还有两个小点:1.将print()替换为pprint()的技巧在不考虑print()函数本身参数的情况下,引入pprint模块后可以写“print=pprint.pprint”,让print()有换脸的效果:importpprintprint=pprint.pprintmylist=["Beautifulisbetterthanugly.","Explicitisbetterthanimplicit.","Simpleisbetterthancomplex.","Complexisbetterthancomplicated."]print(mylist)#类比本文开头的例子【'Beautifulisbetterthanugly.','Explicitisbetterthanimplicit.','Simpleisbetterthancomplex.','复杂总比复杂好。']2.中国人开发的蜂印图。国内的一个pan同学在Github上开源了一个beeprint,显然是对标pprint的。项目地址:https://github.com/panyananyany/beeprint优化了字典对象的打印,对于从其他语言(比如Java)转过来的同学来说是个福音:它还优化了长文本的打印,支持打印自定义对象并且看起来不错。不过其他功能还不够完善,作者已经停止维护两年了,放弃很久了。。。总的来说,pprint是print()的轻量级替代品,简单实用,极其方便(毕竟是标准库),文档丰富,有保证。所以,如果你想打印漂亮易读的数据,不妨试试这个pprint标准库。作者简介:猫下豌豆花,广东人,毕业于武汉大学,现为苏飘程序员。他有一些极客思维,有一些人文情怀,有温度,有态度。:《Python猫》(python_cat)公众号【Python猫】,本号连载系列精品文章,包括喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、高-优质英文推荐及翻译等,欢迎关注。