在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

讓Python輸出更整潔:PrettyPrinter

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

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

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

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

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

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

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

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

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

以上所有工具都達(dá)不到我對(duì)美化打印體驗(yàn)的要求,因此我開始做以下幾點(diǎn)改進(jìn):

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

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

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

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

最有趣的改進(jìn)是描述性API,下面是它的工作原理

簡單、描述性的API

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

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

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

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

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

cpprint的輸出如下:

點(diǎn)擊the PrettyPrinter definition code for standard library types,查看更多案例。

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

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

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

如果想得到以下輸出:

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

結(jié)論

我非常享受將PrettyPrinter作為開發(fā)工具包的一部分。單獨(dú)一篇文章只能粗略分享一些點(diǎn),還有很多有趣的部分等待你去探索,強(qiáng)烈推薦大家嘗試一下!在IPython中使用效果更佳,因?yàn)榻换ナ浇忉屍鳝h(huán)境中的所有結(jié)果都可以自動(dòng)使用PrettyPrinter打印輸出。文檔中有對(duì)該命令的設(shè)置的說明。

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

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

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84694

原文標(biāo)題:讓Python輸出更漂亮:PrettyPrinter

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Python 語言的發(fā)展簡史

    個(gè)函數(shù)。一個(gè)Python程序員應(yīng)該很容易理解這段程序。ABC語言使用冒號(hào)和縮進(jìn)來表示程序塊。行尾沒有分號(hào)。for和if結(jié)構(gòu)中也沒有括號(hào)()。賦值采用的是PUT,而不是常見的等號(hào)。這些改動(dòng)ABC程序
    發(fā)表于 09-28 10:14

    代碼整潔之道

    代碼整潔之道
    發(fā)表于 08-26 16:07

    如何邊緣計(jì)算安全?

    邊緣計(jì)算中的安全挑戰(zhàn)如何邊緣計(jì)算安全?可擴(kuò)展的邊緣安全方案
    發(fā)表于 02-26 06:36

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

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

    你的 Python 代碼優(yōu)雅又地道

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

    代碼質(zhì)量和其整潔度成正比有什么道理如何進(jìn)行代碼整潔教材免費(fèi)下載

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

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

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

    超簡單:用PythonExcel飛起來

    超簡單:用PythonExcel飛起來
    發(fā)表于 05-25 10:46 ?56次下載

    Python中實(shí)現(xiàn)簡單好用的函數(shù)運(yùn)算緩存

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

    汽車成像您的汽車安全

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

    如何Python和Go互相調(diào)度

    我們?cè)?jīng)研究過如何Python和Go互相調(diào)度,當(dāng)時(shí)發(fā)現(xiàn),將Go語言寫的模塊打包成動(dòng)態(tài)鏈接庫,就能在Python中進(jìn)行調(diào)度: 優(yōu)劣互補(bǔ)! Python+Go結(jié)合開發(fā)的探討 Go的優(yōu)勢(shì)很
    的頭像 發(fā)表于 11-02 11:24 ?619次閱讀
    如何<b class='flag-5'>讓</b><b class='flag-5'>Python</b>和Go互相調(diào)度

    python輸出list的每一個(gè)元素

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

    python輸出換行符\n怎么用

    Python中,要輸出換行符"n",可以使用print函數(shù)。print函數(shù)可以接受多個(gè)參數(shù),并將它們打印到控制臺(tái)。 下面是一個(gè)使用print函數(shù)輸出換行符的簡單示例: print
    的頭像 發(fā)表于 11-22 10:48 ?2226次閱讀

    python如何多行輸出為一行

    Python中有多種方法可以將多行輸出改為一行輸出。 一種方法是使用end參數(shù)將換行符替換為其他字符。默認(rèn)情況下,print函數(shù)會(huì)在輸出的結(jié)尾處自動(dòng)添加一個(gè)換行符,導(dǎo)致每個(gè)print語
    的頭像 發(fā)表于 11-24 09:45 ?7447次閱讀

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

    模糊,帶著這個(gè)問題,本人讀完了世界軟件開發(fā)大師馬丁的《代碼整潔之道》這本書,來了解下大師眼中的整潔代碼畫像是什么樣的,相信能給你帶來不一樣的理解和感悟。 關(guān)于整潔代碼,沒有明確的定義,有多少程序員就有多少種定
    的頭像 發(fā)表于 09-09 16:30 ?342次閱讀
    代碼<b class='flag-5'>整潔</b>之道-大師眼中的<b class='flag-5'>整潔</b>代碼是什么樣
    主站蜘蛛池模板: 性夜黄a爽影免费看| 欧美三级视频在线| 国产98色在线| а中文在线天堂| 亚洲成电影| 视频三区| 欧美成人天天综合在线视色| 天天综合网在线| 黑粗硬大欧美视频| 一级做α爰片久久毛片| 国产专区视频| 亚洲mm8成为人影院| 色综合婷婷| 亚洲第一视频在线观看| 亚洲一区二区综合| 男人的天堂免费网站| 久久天天躁狠狠躁夜夜2020一| 一级毛片在线看在线播放| 福利片免费一区二区三区| 男人女人真曰批视频播放| 亚洲图色视频| www.亚洲天堂| 亚洲欧洲一区二区三区在线| 女人张开腿给人桶免费视频| 久久国产精品岛国搬运工| 香蕉视频黄色片| 在线免费国产| 好爽好黄的视频| 成人性视屏| 亚洲人成网站色7799在线观看| 色视频欧美| 乱人伦xxxx国语对白| 婷婷久久综合网| 天天干b| 亚洲成人综合在线| 网色| 婷婷综合色| 天天做天天爱夜夜爽| 一级伦奸视频| 天天爽天天狼久久久综合| 亚洲狠狠网站色噜噜|