女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

讓Python輸出更整潔:PrettyPrinter

馬哥Linux運維 ? 來源:未知 ? 作者:李建兵 ? 2018-03-17 09:04 ? 次閱讀

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

以下是使用PrettyPrinter輸出結果的截圖:

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

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

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

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

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

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

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

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

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

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

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

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

簡單、描述性的API

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

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

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

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

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

cpprint的輸出如下:

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

帶狀態實例的表示

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

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

如果想得到以下輸出:

可以通過如下定義來實現:

結論

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

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

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

    關注

    56

    文章

    4825

    瀏覽量

    86171

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    鼠標暖和的設計

    鼠標暖和的設計做法很簡單,打開鼠標,在頂蓋內部鋪上20個82歐姆的電阻,使用USB接口給它供電。
    發表于 01-04 16:47 ?924次閱讀

    Python 語言的發展簡史

    個函數。一個Python程序員應該很容易理解這段程序。ABC語言使用冒號和縮進來表示程序塊。行尾沒有分號。for和if結構中也沒有括號()。賦值采用的是PUT,而不是常見的等號。這些改動ABC程序
    發表于 09-28 10:14

    代碼整潔之道

    代碼整潔之道
    發表于 08-26 16:07

    如何邊緣計算安全?

    邊緣計算中的安全挑戰如何邊緣計算安全?可擴展的邊緣安全方案
    發表于 02-26 06:36

    [代碼整潔之道].(美)馬丁.掃描版

    電子發燒友網站提供《[代碼整潔之道].(美)馬丁.掃描版.txt》資料免費下載
    發表于 02-06 16:47 ?0次下載

    你的 Python 代碼優雅又地道

    Python社區文化的澆灌下,演化出了一種獨特的代碼風格,去指導如何正確地使用Python,這就是常說的pythonic。一般說地道(idiomatic)的python代碼,就是指這份代碼很
    的頭像 發表于 03-06 10:35 ?3768次閱讀

    代碼質量和其整潔度成正比有什么道理如何進行代碼整潔教材免費下載

    《代碼整潔之道》是2010年1月由人民郵電出版社出版的圖書,作者是馬丁。本書主要講述了代碼質量與其整潔度成正比的道理,并由此揭示代碼整潔之道。《代碼整潔之道》講述了一系列行之有效的
    發表于 11-28 08:00 ?1次下載

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

    PrettyPrinterPython 3.6 及以上版本中的一個功能強大、支持語法高亮、描述性的美化打印包。
    的頭像 發表于 12-08 10:45 ?9174次閱讀

    超簡單:用PythonExcel飛起來

    超簡單:用PythonExcel飛起來
    發表于 05-25 10:46 ?58次下載

    Python中實現簡單好用的函數運算緩存

    我們即將學習的是:在Python中實現簡單好用的函數運算緩存。 函數運算緩存,顧名思義就是我們可以針對指定的函數,其記住過往參數輸入和返回結果,使得后續接收到相同的參數時跳過函數運算,直接返回已緩存的結果值。
    的頭像 發表于 08-05 11:05 ?1187次閱讀

    汽車成像您的汽車安全

    汽車成像您的汽車安全
    發表于 11-02 08:16 ?0次下載
    汽車成像<b class='flag-5'>讓</b>您的汽車<b class='flag-5'>更</b>安全

    如何Python和Go互相調度

    我們曾經研究過如何Python和Go互相調度,當時發現,將Go語言寫的模塊打包成動態鏈接庫,就能在Python中進行調度: 優劣互補! Python+Go結合開發的探討 Go的優勢很
    的頭像 發表于 11-02 11:24 ?839次閱讀
    如何<b class='flag-5'>讓</b><b class='flag-5'>Python</b>和Go互相調度

    python輸出list的每一個元素

    使用for循環來遍歷列表,并輸出其中的每一個元素。接下來,我將詳盡、詳實、細致地介紹一下Python輸出列表的每一個元素的方法,希望能對你有所幫助。 首先,我們需要明確一下什么是列表。列表是一種有序的可變序列,其中可以包含任意類
    的頭像 發表于 11-21 16:16 ?2197次閱讀

    python如何多行輸出為一行

    Python中有多種方法可以將多行輸出改為一行輸出。 一種方法是使用end參數將換行符替換為其他字符。默認情況下,print函數會在輸出的結尾處自動添加一個換行符,導致每個print語
    的頭像 發表于 11-24 09:45 ?8338次閱讀

    代碼整潔之道-大師眼中的整潔代碼是什么樣

    模糊,帶著這個問題,本人讀完了世界軟件開發大師馬丁的《代碼整潔之道》這本書,來了解下大師眼中的整潔代碼畫像是什么樣的,相信能給你帶來不一樣的理解和感悟。 關于整潔代碼,沒有明確的定義,有多少程序員就有多少種定
    的頭像 發表于 09-09 16:30 ?598次閱讀
    代碼<b class='flag-5'>整潔</b>之道-大師眼中的<b class='flag-5'>整潔</b>代碼是什么樣