允许深层提取分层数据结构(如JSON)的库。
magic-dot的Python项目详细描述
魔点
允许对分层数据结构(如JSON)进行深度提取的库。在
- 自由软件:BSD许可证
- 文档:https://magic-dot.readthedocs.io。在
简介
Magic Dot封装数据以允许对其内容进行多功能提取。 它比典型的setdefault或try:except更容易使用 从类似JSON的结构化中提取。考虑下面的简化JSON 剪嘴卷曲https://api.github.com/events:
import json data = json.loads(""" [ { "type": "PushEvent", "payload": { "commits": [ { "author": { "name": "Bubba" }}]}}] """)
{4$如果第一个名字^没有人可以检索第一个 该链的一部分丢失了以下内容:
^{pr2}$由于传入的JSON在没有magic_dot的情况下是不可信的,因此必须验证它 每一层都在那里。这可以用一个try:except来完成,几乎与 效率高,但更冗长。在
try: name = data[0]['payload']['commits'][0]['author']['name'] except (IndexError, KeyError): name = "nobody"
其他的特征,比如拔毛,选择性的例外, 属性支持和迭代可以产生更干净的代码。在
特点
原谅未找到处理
对MagicDot结构的操作不会引发任何异常 当其中一个属性或键未找到时。相反,它延迟了 直到最后提取数据的get()调用。 当调用get()时,有三种处理方法 缺少数据:
默认返回magic_dot.未找到
>>> md.nonexistent.get() magic_dot.NOT_FOUND
您可以请求magic的默认值_dot.未找到
>>> md.nonexistent.get('bubba') 'bubba'
,或者您可以在引用不存在的数据时启用异常
>>> md.exception().nonexistent --------------------------------------------------------------------------- NotFound Traceback (most recent call last)
默认情况下不启用异常。它们可以在创建期间启用 一、 {E$打开^并关闭} MagicDot::exception(exception=False)方法。在
Dict和列表项处理
当遇到md[item]时,将按如下方式提取数据:
- 如果md.__data[item]存在,则使用它。在
- 如果md.__data.item属性存在,则使用它。在
- 如果启用了.exception(),则引发NotFound异常。在
- 否则,md.NOT_FOUND被分配给结果封装的数据。在
属性处理
当提供md.key时,将按如下方式提取数据:
- 如果md.__data.key属性存在,则使用它。在
- 如果md.__data[key]item存在,则使用它。在
- 如果启用了.exception(),则引发NotFound异常。在
- 否则,md.NOT_FOUND将分配给结果md.__data。在
迭代支持
如果当前封装的数据是iterable,MagicDot支持迭代 覆盖包含的数据,结果迭代是MagicDot包装器 围绕迭代数据。在
>>> from collections import namedtuple >>> data = [1, {'x': 2}, namedtuple('x', 'x')(3)] >>> for md in MagicDot(data): ... print(md.get()) 1 {'x': 2} x(x=3)
默认情况下,如果试图迭代NOT_FOUND数据,TypeError 将被提高。迭代代码可以改为返回空列表。::
>> md = MagicDot(1, iter_nf_as_empty=True) >> for x in md.nonexistent: .. print(md.get()) (prints nothing)
其他操作员
目前,还有一个额外的操作符MagicDot::pluck(),如果 尝试将一个名为list的属性提取出来 或整个列表中的键。返回的值是一个MagicDot,其中包含新的抽取列表。在
未来增强
未来的增强将是支持许多Underscore js数组和集合功能 比如compact,reject,和count。在
学分
此包是用Cookiecutter和audreyr/cookiecutter-pypackage项目模板创建的。在
历史
0.2.0(2020-04-30)
- 这包含一些不向后兼容的修改。在
- Remove.lists()支持。在
- Add.pull()支持。在
- 在生成NOT\u FOUND而不是在.get()处生成时引发的Change exception()
- 对文档进行更改以反映上述内容。在
0.1.1(2020-03-19)
- 没有明显的变化。测试github发布自动化。在
0.1.0(2020-03-19)
- PyPI的第一个版本。在
- 项目
标签: