使用glom輕鬆處理嵌套結構數據

使用glom轻松处理嵌套结构数据

本文介紹glom,Python中被忽略的,嵌套對象與數據的運算符。

如果你一點就通,請訪問glom.readthedocs.io查看完整的API文檔和教程。

如果你理解起來有困難,請看這個5分鐘的視頻(鏈接:https://www.youtube.com/watch?v=3aREXkfeWek)。如果你還是沒什麼概念,請關注我的推特:https://twitter.com/mhashemi/status/994111054702522369。

嵌套結構的困擾

關於Python,有一種說法是“扁平比嵌套好。”

也許時代已經發生了變化,或者這個說法更多的是針對代碼而不是數據。儘管有這樣的忠告,嵌套數據仍然在增長,從文檔存儲到RPC系統、結構化日誌,再到在線JSON Web服務。

如果“扁平”是全部的話,為什麼命名空間會成為一個好主意?沒有人喜歡人為的扁平性,沒有人想用40個參數來調用一個函數。

嵌套數據可能有點複雜。讀取嵌套很深的結構化數據可能會遇到一些錯誤。看看這行簡單的代碼:

使用glom轻松处理嵌套结构数据

這一行代碼可能會導致至少四種不同的異常,每種異常的提示都沒什麼指導意義,很難判斷問題所在:

使用glom轻松处理嵌套结构数据

顯然,我們需要一些工具來讀取嵌套數據。

輸入glom。

重組數據

glom是處理數據的新方法,其特點是:

--基於路徑訪問嵌套結構

--使用輕量級的Python規範進行聲明性數據轉換

--可讀的、有意義的錯誤消息

--內置數據搜索和調試功能

像glom這樣簡單而強大的工具使得人們將它與其它模塊進行比較(鏈接:http://glom.readthedocs.io/en/latest/by_analogy.html)。

雖然存在相似之處,但在以下幾個方面glom與其它工具有所不同:

1、不僅僅是訪問數據

許多處理嵌套數據的工具僅僅是執行數據的深度獲取與搜索。由於數據訪問幾乎總是在任務之前,glom進一步改變樣式,實現數據的完全聲明式轉換。

舉例介紹,讓我們從訪問“太空時代”開始,即經典的“深度獲取”:

使用glom轻松处理嵌套结构数据

術語速查:

target是我們的數據,可以是字典,列表或者其它任何對象。

spec是我們想要的輸出結果。

由於output = glom(target, spec) 已經輸出到內存,glom可以開始執行新的任務。

我們的天文學家希望專注於太陽系,並將行星作為一個列表。讓我們重新構造數據以創建一個名稱列表:

使用glom轻松处理嵌套结构数据

假設我們想要獲得一個並行列表,其中包含行星名稱及其衛星數量:

使用glom轻松处理嵌套结构数据

儘管輸入的是嵌套型數據,但我們可以隨數據本身的變化,儘快地改變數據參數,重組我們的結果。像列表推導一樣,對於嵌套數據,我們的代碼反映了我們的輸出。

這才剛剛開始。

2、真正的Python工具

其它大多數類似的工具侷限於特定的數據格式或是純模塊,如jmespath或者XPath / XSLT。 glom沒有犧牲實用性,充分利用了Python本身的全部功能。

回到我們的例子,假設我們想要得到衛星的總數:

使用glom轻松处理嵌套结构数据

通過glom,您可以在任何時刻完全訪問Python。可以將值傳遞給函數,無論是內置的,導入的還是用lambda內聯定義的。但glom的功能還不止於此。

現在我要介紹我最喜歡的功能之一。藉助Python的強大功能,我們分析以下語法:

使用glom轻松处理嵌套结构数据

剛剛發生了什麼?

T代表target,它充當數據的替身。 T記錄您獲得的每個鍵,您訪問的每個屬性,您整理的每個索引以及您調用的每種方法。然後獲得一個一樣可用的spec。

不用擔心如果屬性是None或沒有設置鍵值。即便這樣,T永遠不會引發異常,所以最糟糕的情況是,當你運行glom時,你會得到一個有意義的錯誤信息。

如果你確定沒有數據,只需設置一個默認值:

使用glom轻松处理嵌套结构数据

最後,進行了空值合併運算!

還有更多功能。這種靈活性讓我愛上了Python。沒有其它語言可以做到這一點。

這就是為什麼glom首先是一個Python庫,然後才是命令行工具。哦,我還沒有提到有命令行功能?

3、首先是庫,然後是命令行工具

像jq這樣的工具對控制檯很有用,但也會產生混亂的路徑。 glom的全功能命令行界面只是其更廣泛應用的基礎。

使用glom轻松处理嵌套结构数据

我們會獲得這樣一個列表:

使用glom轻松处理嵌套结构数据

用Python文字規範將JSON導入glom,並輸出漂亮的JSON。這是處理和過濾API調用、搜索數據的好方法。這是真正令人愉快的,因為你知道你不會被導入錯誤困擾。

命令行中的所有內容都可以直接移植到真實的Python程序中,具有更好的錯誤處理能力和無限的集成可能性。

下一步

在使用glom前,我從來沒有想過可以如此快速地將一段代碼投入實際應用。

首次提交代碼後的兩週內,glom體現了黃金般的價值,glom替代了Django Rest Framework兩到五倍的代碼量,使代碼庫運行更快,更易讀。同時,glom的核心非常緊湊,我們正在進行大量的文檔編寫和測試工作,而不是編寫代碼。

除非另有說明,glom函數與其餘的API一起是穩定運行的。

其它許多功能正在開發中。目前,我們將重點放在以下領域:

--主框架中相關功能的驗證。

--命令行的靈活性,更直觀的錯誤消息等。

--擴展API,清理一些內部代碼,打開擴展。

--共同安裝包(例如,Django)的自動默認註冊。

我們將在PyCon上討論相關問題,如果可以的話,請嘗試用一下。無論什麼情況,我都希望你能嘗試用一下glom,讓我們知道它的效果怎麼樣!

英文原文:https://sedimental.org/glom_restructured_data.html
譯者:錢利鵬


分享到:


相關文章: