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

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

3天内不再提示

一个Python模块Addit属性设置

Linux爱好者 来源:Python实用宝典 作者:Ckend 2021-11-17 10:15 次阅读

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 的字典是一种乐趣!

设置嵌套词典的项是极其舒服的:

>>> fromaddict importDict
>>> 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'] isdictionary['a']
False

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

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

3.要牢记的事情

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

>>> addicted = Dict()
>>> addicted.a.b.c.d.e = 2
>>> addicted[2] = [1, 2, 3]
{2: [1, 2, 3], 'a': {'b': {'c': {'d': {'e': 2}}}}}

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

>>> 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__
raiseAttributeError("'Dict' object attribute '%s' is read-only"% name)
AttributeError: 'Dict'object attribute 'keys'isread-only

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

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

5.默认值

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

>>> classDictNoDefault(Dict):
>>> def__missing__(self, key):
>>> raiseKeyError(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()

forrow indata:
born = row['born']
gender = row['gender']
eyes = row['eyes']

counter[born][gender][eyes] += 1print(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 就行。

责任编辑:haq


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

    关注

    56

    文章

    4795

    浏览量

    84647

原文标题:Python 里超级好用的字典模块:Addict 模块

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何设置条形码扫描器模块,扫码器常见威廉希尔官方网站 问题的解决

    随着现代商业和工业的快速发展,条形码扫描器模块已经成为日常工作中不可或缺的部分。然而,对于许多用户来说,如何正确地设置这些设备仍然是
    的头像 发表于 11-11 15:38 195次阅读
    如何<b class='flag-5'>设置</b>条形码扫描器<b class='flag-5'>模块</b>,扫码器常见威廉希尔官方网站
问题的解决

    TCP IP协议属性设置中的IP配置

    在现代网络中,TCP/IP协议是基础架构的重要组成部分。掌握TCP/IP协议属性设置中的IP配置对于确保网络的稳定性、性能和安全至关重要。本文将深入探讨TCP/IP协议中的IP配置,包括IP地址
    的头像 发表于 07-23 10:10 499次阅读

    opencv-python和opencv样吗

    样。OpenCV(Open Source Computer Vision Library)是开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV-Pytho
    的头像 发表于 07-16 10:38 1167次阅读

    python训练出的模型怎么调用

    使用pickle模块 pickle 是Python内置模块,用于序列化和反序列化Python
    的头像 发表于 07-11 10:15 1903次阅读

    鸿蒙ArkTS声明式开发:跨平台支持列表【无障碍属性】 通用属性

    组件可以设置相应的无障碍属性和事件来更好地使用无障碍能力。
    的头像 发表于 06-11 17:30 399次阅读
    鸿蒙ArkTS声明式开发:跨平台支持列表【无障碍<b class='flag-5'>属性</b>】 通用<b class='flag-5'>属性</b>

    鸿蒙ArkTS声明式开发:跨平台支持列表【栅格设置】 通用属性

    默认占用列数,指useSizeType属性没有设置对应尺寸的列数(span)时,占用的栅格列数。
    的头像 发表于 06-05 09:28 396次阅读
    鸿蒙ArkTS声明式开发:跨平台支持列表【栅格<b class='flag-5'>设置</b>】 通用<b class='flag-5'>属性</b>

    WiFi模块网络配置基本设置

    网络很简单,但是需要串口输入,般需要在单片机系统上提供一个人机交互接口。        2、微信Air-Kiss网络配置        A.Wi-Fi模块只能对连接上互联网的路由器进行配网。        没有联网的局域网路由
    的头像 发表于 05-31 10:32 640次阅读

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

    为了实现这些目标,Python 为我们提供了random() 模块。random() 是内置的 Python
    的头像 发表于 04-15 12:47 656次阅读

    gis按属性选择怎么选择两

    GIS(地理信息系统)是种用于存储、管理、处理和分析地理空间数据的威廉希尔官方网站 。在GIS中,按照属性进行选择是种常见的操作,可以根据数据记录的属性条件来筛选出符合特定要求的数据。下面将详细
    的头像 发表于 02-25 11:04 3109次阅读

    arcgis中如何关联两属性

    在ArcGIS中,关联两属性表是重要的操作,可以通过此操作将两表中的数据关联起来,以便进行分析和查询。下面是详细介绍如何在ArcGI
    的头像 发表于 02-25 11:01 4200次阅读

    mapgis如何进行属性连接

    MapGIS是种强大的GIS(地理信息系统)软件,它提供了许多功能来处理和分析空间数据。在MapGIS中,属性连接是种非常有用的功能,它可以将两或多个地图层中的
    的头像 发表于 02-25 10:59 1669次阅读

    Python智能家居系统代码介绍

    与设备的控制、用户界面设计以及扩展性与可靠性等方面。 、系统结构与功能模块 Python智能家居系统的整体结构可以分为三主要模块:传感器
    的头像 发表于 01-25 09:46 1355次阅读

    如何使用Python PySNMP模块获取设备指标呢?

    PySNMP 是跨平台的纯Python SNMP 引擎实现。
    的头像 发表于 01-12 13:59 3099次阅读

    labview小数位数设置

    点击控件选择“属性”来进行设置。在属性设置窗口中有“Display format”的选项,用
    的头像 发表于 01-08 11:35 6479次阅读

    加速Python for循环的12种方法

    Python内建的常用功能是timeit模块。下面几节中我们将使用它来度量循环的当前性能和改进后的性能。
    的头像 发表于 01-04 17:33 1941次阅读
    加速<b class='flag-5'>Python</b> for循环的12种方法