0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何讓Python輸出更漂亮:PrettyPrinter美化打印包使用手冊

馬哥Linux運維 ? 來源:未知 ? 2018-12-08 10:45 ? 次閱讀

PrettyPrinter是Python 3.6 及以上版本中的一個功能強大、支持語法高亮、描述性的美化打印包。它使用了改進的Wadler-Leijen布局算法,和Haskell打印美化庫中的prettyprinter以及anti-wl-pprint、 JavaScript的Prettier、Ruby的prettypreinter.rb 以及 IPython的Ipython.lib.pretty類似。Python的PrettyPrinter集以上眾家之所長,并在此基礎(chǔ)上繼續(xù)改進,因此也成為目前Python最強大的美化輸出工具。

以下是使用PrettyPrinter輸出結(jié)果的截圖:

為什么Python還需要額外的美化打印包呢?

無論是IDE還是開發(fā)者手動運行命令,將數(shù)據(jù)打印到屏幕上是程序運行過程中程序員和數(shù)值交互的最基礎(chǔ)的界面。改進該界面有助于提升開發(fā)體驗和生產(chǎn)效率。Python本身和第三方庫都提供了一些工具來達到此目的:

__repr__和__str__兩個下劃線方法返回普通字符串。__repr__應該盡可能返回語法正確的Python表達式,斷言判斷失敗及控制臺計算結(jié)果打印最常用的就是該方法。由于其完全基于字符串格式化,因此并不具備美化打印的功能。

標準庫中的pprint模塊為dicts, lists, tuples, sets, and frozensets等內(nèi)置數(shù)據(jù)類型提供了美化打印的功能。它將__repr__方法應用在用戶自定義的類實例上。然而,它使用了非常貪婪的布局算法,導致在很多情況下的美化打印出現(xiàn)問題。由于自定義的美化打印受__repr__所限制,pprint的作用也就限制于內(nèi)置數(shù)據(jù)類型了。

第三方庫pprintpp是對pprint的改進及替代方案,也可以對輸出進行優(yōu)化,不過和pprint一樣受限于__repr__使用的代碼美化定義。

IPython中默認的打印模塊IPython.lib.pretty的目標是pprint更進階的替代方案。和pprint相比,它在很多方面都表現(xiàn)得更好:大多數(shù)情況下算法都能對輸出進行美化,而且提供了針對用戶自定義類型美化輸出的定義工具,能和輸出的其他部分實現(xiàn)比較好的結(jié)合。不過,為了實現(xiàn)你自己的美化打印方式,你需要對布局算法有所了解。另外,該API 也有一些與生俱來的副作用:調(diào)用美化打印工具將數(shù)據(jù)直接推送至布局緩沖區(qū),不允許原始布局對數(shù)據(jù)進行初步檢測。

以上所有工具都達不到我對美化打印體驗的要求,因此我開始做以下幾點改進:

實現(xiàn)一個能盡可能多的美化打印的算法,即便在效率上做出一些犧牲。花十分之一秒對輸出結(jié)果進行美化是非常劃算的,因為當你需要在結(jié)果中尋找自己需要的數(shù)據(jù)時它將為你節(jié)約兩秒鐘的時間。

實現(xiàn)一個超級簡單、描述性的接口來實現(xiàn)用戶自定義的美化打印工具。Python成員幾乎不會重寫__repr__方法,因為這很痛苦;幾乎沒有人愿意為用戶定義的類型編寫整齊打印規(guī)則,除非類型非常簡單。

實現(xiàn)不會在無效Python語法上中斷的語法高亮顯示。并不是所有__repr__方法都會返回有效的語法,一旦發(fā)生語法錯誤會打斷正常的語法高亮。

新的代碼美化包的使用體驗令我非常驚訝。算法運行的很出色,效率也滿足需求。而用戶自定義美化規(guī)則的方法也很簡單,僅僅需要了解兩個描述性的函數(shù) register_pretty和pretty_call即可。語法高亮看上去非常漂亮,且不會被無效語法處中斷。特別是語法高亮,會使你很難再回到普通的美化打印工具,它大大提升了程序員的開發(fā)體驗。

最有趣的改進是描述性API,下面是它的工作原理。

簡單、描述性的API

在PrettyPrinter中定義輸出美化方法主要基于(創(chuàng)建)函數(shù)調(diào)用。所有非字符的Python值都需要用函數(shù)結(jié)果表示。該庫的主力函數(shù)是pretty_call, 它允許你來描述PrettyPrinter應該輸出何種類型的函數(shù)調(diào)用。下面就是pretty_call調(diào)用的一個例子:

PrettyPrinter處理原始布局的過程類似于以下語句:

(第一個參數(shù)ctx允許用戶控制案例中[5,3,6,1]列表中嵌套的數(shù)據(jù),reverse參數(shù)的True值依據(jù)此進行渲染。大部分情況都直接使用默認值即可。)

上面介紹了如何使用Pretty_call,接下來定義我們自己的類型。

使用register_pretty修飾符,可以為MyClass類定義美化方式:

cpprint的輸出如下:

點擊the PrettyPrinter definition code for standard library types,查看更多案例。

帶狀態(tài)實例的表示

調(diào)用函數(shù)的一個缺陷是無法很好的表示帶狀態(tài)的實例。通常你想要額外輸出一些信息來表示實例的狀態(tài)。PrettyPrinter使用解釋性評論解決了這一問題,我對這一強大的特性頗為滿意。使用評論來標注Python值(或者表示Python值的原始布局),該評論將神奇的出現(xiàn)在輸出的結(jié)果中。

假如我們定義了一個包含其連接與斷開兩個狀態(tài)的Connection類:

如果想得到以下輸出:

可以通過如下定義來實現(xiàn):

結(jié)論

我非常享受將PrettyPrinter作為開發(fā)工具包的一部分。單獨一篇文章只能粗略分享一些點,還有很多有趣的部分等待你去探索,強烈推薦大家嘗試一下!在IPython中使用效果更佳,因為交互式解釋器環(huán)境中的所有結(jié)果都可以自動使用PrettyPrinter打印輸出。文檔中有對該命令的設置的說明。

點擊source code on GitHub查看該項目的源碼,文檔在documentation on readthedocs.io(目前可能還略顯簡陋)。包中內(nèi)置了針對Django模型、QuerySets以及使用attrs包創(chuàng)建的所有類的現(xiàn)成的定義。因此如果你恰好也用到了其中的某個,毫無疑問你會想馬上試試它的!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1506

    瀏覽量

    62205
  • IDE
    IDE
    +關(guān)注

    關(guān)注

    0

    文章

    338

    瀏覽量

    46794
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4801

    瀏覽量

    84849

原文標題:讓Python輸出更漂亮:PrettyPrinter

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    freebsd使用手冊pdf

    freebsd使用手冊pdfThe FreeBSD Documentation Project FreeBSD 中文計劃,為PDF文檔格式。FREEBSD使用手冊分成了三個邏輯清晰的部分。第一部
    發(fā)表于 10-21 17:22

    EMC分析使用手冊

    EMC分析使用手冊 [/hide]
    發(fā)表于 10-10 16:33

    USB設計及使用手冊

    USB設計及使用手冊  [hide]USB使用手冊.rar[/hide][此貼子已經(jīng)被作者于2009-11-19 11:52:30編輯過]
    發(fā)表于 11-19 11:51

    fpga使用手冊

    fpga使用手冊,菜鳥必備get
    發(fā)表于 06-09 22:20

    CANopen使用手冊

    CANopen使用手冊
    發(fā)表于 09-20 16:01

    1602液晶使用手冊

    液晶1602的使用手冊附有應用的例子
    發(fā)表于 10-30 17:31

    Cadence使用手冊經(jīng)典

    Cadence使用手冊經(jīng)典
    發(fā)表于 01-15 17:05

    加密芯片使用手冊

    加密芯片的安全性:1、芯片本身硬件的安全,采用U盾芯片2、算法安全,可以采用國家商用密碼算法,如SM1,SM7,SSF33等算法,是保密非公開算法。加密芯片使用手冊見附件 加密芯片使用手冊.rar (79.94 KB )
    發(fā)表于 07-09 04:35

    《STM32固件庫使用手冊》中文翻譯版PDF

    STM32固件庫使用手冊的中文翻譯版,需要的拿走大家多多回復,更多需要的朋友看到
    發(fā)表于 08-23 15:58

    Keil軟件使用手冊

    非常的KEIL軟件使用手冊,內(nèi)部包含詳細的軟件的使用介紹,含示例詳解
    發(fā)表于 10-20 19:12

    Segger軟件評估和KEIL MDK開發(fā)工具使用手冊

    Segger 軟件評估和 KEIL MDK 開發(fā)工具初學者使用手冊
    發(fā)表于 12-06 07:30

    Segger軟件評估和IAR開發(fā)工具使用手冊

    Segger 軟件評估和 IAR 開發(fā)工具初學者使用手冊
    發(fā)表于 12-06 07:33

    JMeter 壓力測試使用手冊中文使用手冊

    JMeter 壓力測試使用手冊中文使用手冊
    發(fā)表于 09-05 09:51 ?11次下載
    JMeter 壓力測試<b class='flag-5'>使用手冊</b>中文<b class='flag-5'>使用手冊</b>

    JMeter壓力測試使用手冊的中文使用手冊

    JMeter壓力測試使用手冊的中文使用手冊
    發(fā)表于 09-08 09:57 ?7次下載
    JMeter壓力測試<b class='flag-5'>使用手冊</b>的中文<b class='flag-5'>使用手冊</b>

    Python輸出整潔:PrettyPrinter

    PrettyPrinterPython 3.6 及以上版本中的一個功能強大、支持語法高亮、描述性的美化打印。
    的頭像 發(fā)表于 03-17 09:04 ?7530次閱讀
    <b class='flag-5'>讓</b><b class='flag-5'>Python</b><b class='flag-5'>輸出</b><b class='flag-5'>更</b>整潔:<b class='flag-5'>PrettyPrinter</b>