標籤:

Python 的第三方列印類庫 —— PrettyPrinter

簡評:如果對 Python 標準庫的 pprint 或者第三方庫 pprintpp 不滿意,可以試試這個。

PrettyPrinter 是一個 Python(Python 3.6 或更高版本)的功能強大的第三方列印類庫 (即 Printer)。它使用了改進 Wadler-Leijen 布局演算法,類似於 Haskell 的prettyprinteransi-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_prettypretty_call。該語法高亮美觀大氣,並且在遇到無效語法時不會中斷。

簡單的用法可以查看原文,或者進 Github 查看 README。

原文:Introducing PrettyPrinter for Python

擴展閱讀:

  • 終於,SciPy 1.0 版發布了
  • 一些非常有用的 VSCode 擴展
  • 升級 Flask 到 Quart 獲得 3 倍性能提升

極光日報,極光開發者旗下媒體。

每天導讀三篇英文技術文章。

推薦閱讀:

爬取豆瓣有關張國榮日記(二)—— 策略源碼知識點
文檔結構與樣式初步—— 使用Python讀寫Office文檔之二
有專門關於Python圖形化界面編程的書嗎?
Nginx、Gunicorn在伺服器中分別起什麼作用?

TAG:Python |