使用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
译者:钱利鹏


分享到:


相關文章: