日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

如何美觀地打印 Python 對(duì)象?這個(gè)標(biāo)準(zhǔn)庫(kù)可以簡(jiǎn)單實(shí)現(xiàn)

系統(tǒng) 1951 0

前不久,我寫(xiě)了一篇文章回顧 Python 中 print 的發(fā)展歷史 ,提到了兩條發(fā)展線索:

  • 明線:早期的 print 語(yǔ)句帶有 C 和 Shell 的影子,是個(gè)應(yīng)用程序級(jí)的 statement,在最初十幾年里,經(jīng)歷過(guò) PEP-214 和 PEP-259 的改進(jìn);再到 2009 年的大版本 3.0,由語(yǔ)句改成了 print() 函數(shù),還在 3.3 版本,做過(guò)一次功能增強(qiáng),最終上升成為一等的內(nèi)置函數(shù)。
  • 暗線:介紹了 print 的競(jìng)爭(zhēng)對(duì)手們,像傳統(tǒng)的日志模塊 logging、調(diào)試模塊 pdb、主流 IDE 的調(diào)試功能,以及后起之秀 PySnooper,它們瞄準(zhǔn)著 print 的位置,摩拳擦掌,虎視眈眈。

本文依然跟 print 相關(guān),想介紹的是標(biāo)準(zhǔn)庫(kù)中的 pprint 模塊。

(未經(jīng)授權(quán),請(qǐng)勿轉(zhuǎn)載。文章首發(fā)于:https://mp.weixin.qq.com/s/d1...)

pprint 是“pretty printer”的簡(jiǎn)寫(xiě),“pretty”的含義是“漂亮的、美觀的”,還有表示“相當(dāng)?shù)亍钡某潭日Z(yǔ)氣,因此它的含義便是:(相當(dāng))美觀的打印。

這是個(gè)相當(dāng)簡(jiǎn)單卻有用的模塊,主要用于打印復(fù)雜的數(shù)據(jù)結(jié)構(gòu)對(duì)象,例如多層嵌套的列表、元組和字典等。

先看看 print() 打印的一個(gè)例子:

          
            mylist = ["Beautiful is better than ugly.", "Explicit is better than implicit.", "Simple is better than complex.", "Complex is better than complicated."]

print(mylist)

# 結(jié)果如下:
['Beautiful is better than ugly.', 'Explicit is better than implicit.', 'Simple is better than complex.', 'Complex is better than complicated.']
          
        

這是一個(gè)簡(jiǎn)單的例子,全部打印在一行里。

想象一下,如果對(duì)象中的元素是多層嵌套的內(nèi)容(例如復(fù)雜的 Json 數(shù)據(jù)),或者有超多的元素(例如在列表中存了很多 URL 鏈接),再打印出來(lái)會(huì)是怎樣?

那肯定是一團(tuán)糟的,不好閱讀。

使用 pprint 模塊的 pprint() 替代 print(),可以解決如下痛點(diǎn):

  • 設(shè)置合適的行寬度,作適當(dāng)?shù)膿Q行
  • 設(shè)置打印的縮進(jìn)、層級(jí),進(jìn)行格式化打印
  • 判斷對(duì)象中是否出現(xiàn)無(wú)限循環(huán),并優(yōu)化打印內(nèi)容

1、簡(jiǎn)單使用

語(yǔ)法:pprint(object, stream=None, indent=1, width=80, depth=None, *,compact=False)

默認(rèn)的行寬度參數(shù)為 80,當(dāng)打印的字符(character)小于 80 時(shí),pprint() 基本上等同于內(nèi)置函數(shù) print(),當(dāng)字符超出時(shí),它會(huì)作美化,進(jìn)行格式化輸出:

          
            import pprint

# 打印上例的 mylist
pprint.pprint(mylist)

# 打印的元素是換行的(因?yàn)槌?0字符):
['Beautiful is better than ugly.',
 'Explicit is better than implicit.',
 'Simple is better than complex.',
 'Complex is better than complicated.']
          
        

2、設(shè)置縮進(jìn)為 4 個(gè)空格(默認(rèn)為1)

          
            pprint.pprint(mylist, indent=4)

[   'Beautiful is better than ugly.',
    'Explicit is better than implicit.',
    'Simple is better than complex.',
    'Complex is better than complicated.']
          
        

3、設(shè)置打印的行寬

          
            mydict = {'students': [{'name':'Tom', 'age': 18},{'name':'Jerry', 'age': 19}]}

pprint.pprint(mydict)

# 未超長(zhǎng):
{'students': [{'age': 18, 'name': 'Tom'}, {'age': 19, 'name': 'Jerry'}]}

pprint.pprint(mydict, width=20)

# 超長(zhǎng)1:
{'students': [{'age': 18,
               'name': 'Tom'},
              {'age': 19,
               'name': 'Jerry'}]}

pprint.pprint(mydict, width=70)

# 超長(zhǎng)2:
{'students': [{'age': 18, 'name': 'Tom'},
              {'age': 19, 'name': 'Jerry'}]}
          
        

4、設(shè)置打印的層級(jí)(默認(rèn)全打印)

          
            newlist = [1, [2, [3, [4, [5]]]]]

pprint.pprint(newlist, depth=3)

# 超出的層級(jí)會(huì)用...表示
[1, [2, [3, [...]]]]
          
        

5、優(yōu)化循環(huán)結(jié)構(gòu)的打印

當(dāng)列表或其它數(shù)據(jù)結(jié)構(gòu)中出現(xiàn)循環(huán)引用時(shí),要完整打印出所有內(nèi)容是不可能的。

所以 print 作了簡(jiǎn)化處理,就像上例一樣,只打印外層的殼,而不打印內(nèi)層循環(huán)的東西。

這種處理方式是簡(jiǎn)化了,但沒(méi)有指出是誰(shuí)導(dǎo)致了循環(huán),還容易看漏。

pprint() 方法作了改進(jìn),遇到無(wú)限循環(huán)結(jié)構(gòu)時(shí),會(huì)表示成 的格式。

還有個(gè) saferepr() 方法,也是這樣優(yōu)化,而且返回的是個(gè)字符串:

          
            newlist = [1, 2]
newlist.insert(0, newlist)

# 列表元素指向列表自身,造成循環(huán)引用
# 直接 print 的結(jié)果是:[[...], 1, 2]

pprint.pprint(newlist)
# [
            
              , 1, 2]

pprint.saferepr(newlist)
# '[
              
                , 1, 2]'
              
            
          
        

6、判斷是否出現(xiàn)循環(huán)結(jié)構(gòu)

有兩個(gè)方法可以判斷一個(gè)對(duì)象中是否出現(xiàn)無(wú)限循環(huán):

          
            pprint.isrecursive(newlist)
# True

pprint.isreadable(newlist)
# False
          
        

isreadable() 除了能像 isrecursive() 一樣判斷循環(huán),還能判斷該格式化內(nèi)容是否可被 eval() 重構(gòu)。

以上就是 pprint 模塊的快捷入門(mén)介紹,除此之外,還有 pformat() 方法、PrettyPrinter 類(lèi),以及某些參數(shù)的使用等內(nèi)容,我覺(jué)得沒(méi)有大用,就不多說(shuō)了。

如若感興趣,你可查閱:

  • 官方介紹:https://docs.python.org/zh-cn...
  • 源碼地址:https://github.com/python/cpy...

最后,還有兩個(gè)小小的點(diǎn):

1、用 pprint() 替換 print() 的技巧

在不考慮 print() 函數(shù)本身的參數(shù)的情況下,可以在引入 pprint 模塊后,寫(xiě)上 “print = pprint.pprint”,令 print() 起到改頭換面的效果:

          
            import pprint
print = pprint.pprint

mylist = ["Beautiful is better than ugly.", "Explicit is better than implicit.", "Simple is better than complex.", "Complex is better than complicated."]

print(mylist)

# 可對(duì)比本文開(kāi)頭的例子
['Beautiful is better than ugly.',
 'Explicit is better than implicit.',
 'Simple is better than complex.',
 'Complex is better than complicated.']
          
        

2、國(guó)人開(kāi)發(fā)的 beeprint

國(guó)內(nèi)某位 pan 同學(xué)在 Github 開(kāi)源了個(gè) beeprint ,明顯是對(duì)標(biāo) pprint 的。

項(xiàng)目地址:https://github.com/panyanyany/beeprint

它優(yōu)化了字典對(duì)象的打印,對(duì)于從其它語(yǔ)言轉(zhuǎn)過(guò)來(lái)的同學(xué)而言(例如 Java),這是個(gè)福音:

它還優(yōu)化了長(zhǎng)文本的打印,支持自定義對(duì)象的打印,看起來(lái)不錯(cuò)。

但是,其它功能不夠齊全,而且作者停止維護(hù)兩年了,荒廢已久……

總體而言,pprint 算是 print() 的輕量級(jí)替代,簡(jiǎn)單實(shí)用,極其方便(畢竟是標(biāo)準(zhǔn)庫(kù)),文檔豐富而有保障。

所以,若想要打印美觀易讀的數(shù)據(jù),這個(gè) pprint 標(biāo)準(zhǔn)庫(kù),不妨一試哦。

作者簡(jiǎn)介: 豌豆花下貓,生于廣東畢業(yè)于武大,現(xiàn)為蘇漂程序員,有一些極客思維,也有一些人文情懷,有一些溫度,還有一些態(tài)度。公眾號(hào):「Python貓」(python_cat)

公眾號(hào)【 Python貓 】, 本號(hào)連載優(yōu)質(zhì)的系列文章,有喵星哲學(xué)貓系列、Python進(jìn)階系列、好書(shū)推薦系列、技術(shù)寫(xiě)作、優(yōu)質(zhì)英文推薦與翻譯等等,歡迎關(guān)注哦。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 天气| 宜兰县| 临夏县| 门源| 丹江口市| 赤峰市| 闸北区| 彭阳县| 稷山县| 游戏| 兴国县| 安达市| 房山区| 汉阴县| 宁远县| 溧阳市| 尚义县| 沿河| 黄浦区| 天津市| 南城县| 和田县| 红安县| 阳谷县| 长丰县| 丹阳市| 会同县| 许昌市| 买车| 敦煌市| 通山县| 宾川县| 上虞市| 宜宾市| 新源县| 高邑县| 福贡县| 繁昌县| 扎鲁特旗| 桑日县| 枣阳市|