0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python模块Addict的安装与使用

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-06-21 16:14 次阅读

Addit 是一个Python模块,除了提供标准的字典语法外,Addit 生成的字典的值既可以使用属性来获取,也可以使用属性进行设置。

这意味着你不用再写这样的字典了:

body = {
    'query': {
        'filtered': {
            'query': {
                'match': {'description': 'addictive'}
            },
            'filter': {
                'term': {'created_by': 'Mats'}
            }
        }
    }
}

相反,你只需编写以下三行代码就能完成目的:

body = Dict()
body.query.filtered.query.match.description = 'addictive'
body.query.filtered.filter.term.created_by = 'Mats'

1.安装

你可以通过pip安装:

pip installaddict

或通过conda

conda installaddict -c conda-forge

Addit 在Python2.7+和Python3上都可以运行。

2.用法

Addict 继承自字典,但在访问和设置其值方面更加灵活。使用 Addict 的字典是一种乐趣!
设置嵌套词典的项是极其舒服的:

>>> from addict import Dict
>>> mapping = Dict()
>>> mapping.a.b.c.d.e = 2
>>> mapping
{'a': {'b': {'c': {'d': {'e': 2}}}}}

如果Dict是用任何可迭代值实例化的,它将遍历并克隆这些值,然后写入到对应的属性及值中,比如:

>>> mapping = {'a': [{'b': 3}, {'b': 3}]}
>>> dictionary = Dict(mapping)
>>> dictionary.a[0].b
3

mapping['a']不再与dictionary['a']相同。

>>> mapping['a'] is dictionary['a']
False

当然,此特点仅限于构造函数,而不是在使用属性或设置值时:

>>> a = Dict()
>>> b = [1, 2, 3]
>>> a.b = b
>>> a.b is b
True

3.要牢记的事情

记住,int不是有效的属性名,因此必须使用 get/setitem 语法 设置/获取 非字符串的 dict 键:

>>> mapping = Dict()
>>> mapping.keys = 2
Traceback (most recent call last):
File "", line 1, in 
 File "addict/addict.py", line 53, in __setattr__
 raise AttributeError("'Dict' object attribute '%s' is read-only" % name)
AttributeError: 'Dict' object attribute 'keys' is read-only

不过,你可以随意混合使用这两种语法:

>>> addicted.a.b['c'].d.e
2

4.属性,如键、item等

Addit 不会让你覆盖dict的属性,因此以下操作将不起作用:

>>> mapping = Dict()
>>> mapping.keys = 2
Traceback (most recent call last):
File "", line 1, in 
 File "addict/addict.py", line 53, in __setattr__
 raise AttributeError("'Dict' object attribute '%s' is read-only" % name)
AttributeError: 'Dict' object attribute 'keys' is read-only

不过,使用下面这种方式就可以:

>>> a = Dict()
>>> a['keys'] = 2
>>> a
{'keys': 2}
>>> a['keys']
2

5.默认值

对于不在字典中的键,Addit的行为如defaultdict(Dict),因此丢失的键返回一个空的Dict而不是抛出KeyError如果此行为不是所需的,则可以使用以下方式恢复抛出KeyError:

>>> class DictNoDefault(Dict):
>>>   def __missing__(self, key):
>>>     raise KeyError(key)

但请注意,这样会失去速记赋值功能(addicted.a.b.c.d.e = 2)

6.转化为普通字典

如果你觉得将 Addict 传递到其他函数或模块并不安全,请使用to_dict()方法,它返回会把 Addict 转化为普通字典。

>>> regular_dict = my_addict.to_dict()
>>> regular_dict.a = 2
Traceback (most recent call last):
File "", line 1, in 
 AttributeError: 'dict' object has no attribute 'a'

当您希望在几行代码中创建嵌套的字典,然后将其发送到不同的函数或模块时,这非常适合:

body = Dict()
body.query.filtered.query.match.description = 'addictive'
body.query.filtered.filter.term.created_by = 'Mats'
third_party_module.search(query=body.to_dict())

7.计数

Dict轻松访问和修改深度嵌套属性的能力使其成为计数的理想选择。使用Addict,你还可以容易允许按多个级别计数,内部使用的原理是collections.Counter

比如以下数据:

data = [
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'F', 'eyes': 'green'},
    {'born': 1980, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'F', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'F', 'eyes': 'green'},
    {'born': 1981, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'F', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'M', 'eyes': 'green'},
    {'born': 1981, 'gender': 'F', 'eyes': 'blue'}
]

如果你想计算有多少人出生在born性别的gender使用eyes眼睛,你可以很容易地计算出这些信息

counter = Dict()

for row in data:
    born = row['born']
    gender = row['gender']
    eyes = row['eyes']

    counter[born][gender][eyes] += 1 print(counter)

# 结果:{1980: {'M': {'blue': 1, 'green': 3}, 'F': {'blue': 1, 'green': 1}}, 1981: {'M': {'blue': 2, 'green': 1}, 'F': {'blue': 2, 'green': 1}}}

8.更新

普通字典的更新方式如下:

>>> d = {'a': {'b': 3}}
>>> d.update({'a': {'c': 4}})
>>> print(d)
{'a': {'c': 4}}

addict的更新方式如下,它会递归并实际更新嵌套的字典:

>>> D = Dict({'a': {'b': 3}})
>>> D.update({'a': {'c': 4}})
>>> print(D)
{'a': {'b': 3, 'c': 4}}

9.Addict 是怎么来的?

这个模块完全是从用Python创建Elasticsearch查询的繁琐过程中发展而来的。每当你发现自己在写了很复杂的字典逻辑时,只要记住你没有必要这样做,使用 Addict 就行。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2740

    浏览量

    47829
  • 代码
    +关注

    关注

    30

    文章

    4841

    浏览量

    69196
  • python
    +关注

    关注

    56

    文章

    4811

    浏览量

    85103
收藏 人收藏

    评论

    相关推荐

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是一个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 465次阅读

    Flexus 云服务器 X:Python 安装的极致便捷之旅

    前言         Python 作为一种高级编程语言,因其简洁易读的语法和强大的库支持,在数据科学、人工智能、Web 开发等领域得到了广泛应用。然而,不同平台上的安装过程可能会有所不同,尤其是在
    的头像 发表于 01-07 17:00 137次阅读
    Flexus 云服务器 X:<b class='flag-5'>Python</b> <b class='flag-5'>安装</b>的极致便捷之旅

    使用Python进行串口通信的案例

    当然!以下是一个使用Python进行串口通信的简单示例。这个示例展示了如何配置串口、发送数据以及接收数据。我们将使用 pyserial 库,这是一个非常流行的用于串口通信的Python库。 首先,你
    的头像 发表于 11-22 09:11 562次阅读

    电脑是已经安装python2.7,为什么打开GUI的script window时,一直提示未找到python2.7?

    电脑是已经安装python2.7,为什么打开GUI的script window时,一直提示未找到python2.7?
    发表于 11-14 07:50

    LORA模块安装与配置指南

    以下是LoRa模块安装与配置指南: 一、安装步骤 硬件连接 : 将LoRa模块与主机(如PC或其他具有UART接口的设备)连接起来。通常,LoRa
    的头像 发表于 10-31 17:37 3176次阅读

    python写验证环境cocotb

    本文介绍了cocotb的安装python tb文件的写法、用xrun仿真cocotb的脚本等,我们来看看体验如何。
    的头像 发表于 07-24 09:38 648次阅读
    用<b class='flag-5'>python</b>写验证环境cocotb

    网络模块安装方法

    网络模块安装方法主要包括以下几个步骤,这些步骤将确保安装的准确性和网络模块的稳定运行: 准备阶段: 确定网络设备的型号、规格和技术参数,确保所选的网络
    的头像 发表于 07-12 09:58 902次阅读

    用pycharm进行python爬虫的步骤

    以下是使用PyCharm进行Python爬虫的步骤: 安装PyCharm和Python 首先,您需要安装PyCharm和Python。PyC
    的头像 发表于 07-11 10:11 981次阅读

    安装依赖的Python软件包时报错如何解决?

    安装依赖的 Python 软件包,出现了如下错误,请问如何解决,谢谢! Command \"E:/msys32/mingw32/bin/python2.7.exe E:/msys32
    发表于 06-26 07:32

    用离线安装安装的idf,其创建的Python虚拟环境无激活脚本是怎么回事?

    如题,用离线安装安装的idf,其创建的Python虚拟环境无激活脚本,具体如下图所示: 反而用vscode插件安装的idf有,如下图:vscode插件
    发表于 06-11 06:49

    python 学习:在内网中 python库-numpy 安装方法,升级pip3版本的指令

    指令格式如下:先下载numpy库到C盘具体位置 手动安装指令如下: pip install c:\\\\users\\\\sesa738142
    发表于 04-22 17:18

    如何使用Python生成四位随机数字

    为了实现这些目标,Python 为我们提供了random() 模块。random() 是一个内置的 Python 模块,用于生成随机数。
    的头像 发表于 04-15 12:47 810次阅读

    DC电源模块安装和连接方法

    BOSHIDA DC电源模块安装和连接方法 DC电源模块是一种将交流电转变为直流电的设备,广泛应用于电子产品、通信设备、工业自动化等领域。正确安装和连接DC电源
    的头像 发表于 04-12 13:35 1436次阅读
    DC电源<b class='flag-5'>模块</b>的<b class='flag-5'>安装</b>和连接方法

    电压转换模块安装 电源模块 BOSHIDA直流交流电压转换模块 稳压隔离输出

    电压转换模块安装 电源模块 BOSHIDA直流交流电压转换模块 稳压隔离输出 安装电压转换模块
    的头像 发表于 02-28 09:15 445次阅读

    基于Python的地图绘制教程

    本文将介绍通过Python绘制地形图的方法,所需第三方Python相关模块包括 rasterio、geopandas、cartopy 等,可通过 pip 等方式安装
    的头像 发表于 02-26 09:53 1335次阅读
    基于<b class='flag-5'>Python</b>的地图绘制教程