允许深层提取分层数据结构(如JSON)的库。

magic-dot的Python项目详细描述


魔点

https://img.shields.io/pypi/v/magic_dot.svghttps://img.shields.io/pypi/dm/magic_dot.svghttps://github.com/bonafideduck/magic_dot/workflows/Sanity/badge.svgDocumentation Status

允许对分层数据结构(如JSON)进行深度提取的库。在

简介

Magic Dot封装数据以允许对其内容进行多功能提取。 它比典型的setdefaulttry: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]时,将按如下方式提取数据:

  1. 如果md.__data[item]存在,则使用它。在
  2. 如果md.__data.item属性存在,则使用它。在
  3. 如果启用了.exception(),则引发NotFound异常。在
  4. 否则,md.NOT_FOUND被分配给结果封装的数据。在

属性处理

当提供md.key时,将按如下方式提取数据:

  1. 如果md.__data.key属性存在,则使用它。在
  2. 如果md.__data[key]item存在,则使用它。在
  3. 如果启用了.exception(),则引发NotFound异常。在
  4. 否则,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数组和集合功能 比如compactreject,和count。在

{id10}$

学分

此包是用Cookiecutteraudreyr/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的第一个版本。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
HTTP标头的java InputStream未终止   java测试SpringWebListener   具有定义的替换编号Java的regex ReplaceAll   在java中使用contains()方法   java在选择查询中使用JoinColumn字段   具有用户的java Start-stop demon不是以给定用户启动   java glBufferData生成GL\u无效\u操作   java中循环代码的循环   Java位无符号移位(>>>>)会产生奇怪的结果   java HQL使用点分隔符从select获取结果   条纹、弹簧、玩耍(或?):使用哪种高性能Java框架?   广播接收机中的java停止服务   java回收器视图占据整个屏幕。不在上面显示我的UI元素   java使MySQL查询更快   java MappedByteBuffer查询   java递归算法问题