Python 的第三方列印類庫 —— PrettyPrinter
簡評:如果對 Python 標準庫的 pprint 或者第三方庫 pprintpp 不滿意,可以試試這個。
PrettyPrinter 是一個 Python(Python 3.6 或更高版本)的功能強大的第三方列印類庫 (即 Printer)。它使用了改進 Wadler-Leijen 布局演算法,類似於 Haskell 的prettyprinter
和ansi-wl-pprint
,JavaScript 的 Prettier,Ruby 的prettyprinter.rb
和 IPython 中的IPython.lib.pretty
。PrettyPrinter 吸收了他們的最好的部分,建立了 Python 迄今為止最強大最漂亮的 Printer。
下面用一些漂亮的截圖來演示 PrettyPrinter :
為什麼 Python 需要另一個漂亮的 printer?
不管是通過 IDE 自動完成或是由開發者手動完成,在代碼運行時把相關數值列印到屏幕上是開發者經常會用到的做法(譯者註:比如經典的 Hello World,以及所謂的 Print 調試),Python 本身及第三方庫也提供了相關工具:
__repr__
和__str__
方法返回純文本字元串。__repr__
應該返回一個語法正確的 Python 表達式,並且最常用於失敗的測試斷言,或在 shell 評估值。由於它是完全基於字元串格式化,所以沒有漂亮的列印格式。- 標準庫模塊
pprint
為原生數據類型,如字典、列表、元組和集合提供了漂亮的列印格式。它委託給用戶定義的類實例的 __repr__ 方法,但是,它有一個非常貪婪的布局演算法,在許多情況下不能產生漂亮的輸出。由於你自己漂亮的 printer 定義被限制在__repr__中返回的東西,所以除了原生類型以外,它的功能是有比較大的限制的。 - 第三方庫
pprintpp
是一個 pprint 的改進,但就像pprint
一樣,有些限制。 - IPython 的默認列印類
IPython.lib.pretty
,旨在作為 pprint 的高級替代品。它是pprint
在許多方面高級的實現:該演算法在大多數情況下可以很好地提供漂亮的輸出,並且它提供了一些工具來為用戶自定義類型定義漂亮的列印格式。然而,為了實現自己的漂亮的 printer,你需要知道的布局演算法是如何工作的。
以上所有都不符合我認為非常漂亮的列印體驗。因此我著手做出以下改進:
- 實現一個演算法,即使需要更多的工作,也會儘力產生漂亮的輸出。如果在查看數據時能夠節省兩秒鐘時間,以十分之一秒的時間列印漂亮的數據還是可以接受的。
- 實現一個簡單的聲明性介面,編寫自己的 pretty printers。Python 開發者很少寫
__repr__
方法,除非超級簡單,否則沒有人會為用戶定義的類型編寫漂亮的列印規則。 - 實現在無效 Python 語法上不會中斷的語法高亮
我對 PrettyPrinter 的成績感到驚訝,演算法工作得很好,而且速度足夠快。要定義你自己漂亮的 printer,只需要知道兩個聲明函數register_pretty
和pretty_call
。該語法高亮美觀大氣,並且在遇到無效語法時不會中斷。
簡單的用法可以查看原文,或者進 Github 查看 README。
原文:Introducing PrettyPrinter for Python
擴展閱讀:
- 終於,SciPy 1.0 版發布了
- 一些非常有用的 VSCode 擴展
- 升級 Flask 到 Quart 獲得 3 倍性能提升
極光日報,極光開發者旗下媒體。
每天導讀三篇英文技術文章。
推薦閱讀:
※爬取豆瓣有關張國榮日記(二)—— 策略源碼知識點
※文檔結構與樣式初步—— 使用Python讀寫Office文檔之二
※有專門關於Python圖形化界面編程的書嗎?
※Nginx、Gunicorn在伺服器中分別起什麼作用?
TAG:Python |