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
    +关注

    关注

    60

    文章

    4896

    浏览量

    90597

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索 TPS65010EVM - 230 评估模块:功能、设置与应用指南

    探索 TPS65010EVM - 230 评估模块:功能、设置与应用指南 在电子设备的设计与开发中,电源管理是至关重要的环。德州仪器(TI)的 TPS65010EVM - 230 评估模块
    的头像 发表于 04-25 15:40 654次阅读

    探索TPS62510EVM - 168评估模块:从设置到应用的全面解析

    (Texas Instruments)的TPS62510EVM - 168评估模块(EVM)为工程师们提供了绝佳的工具,用于评估TPS62510开关降压转换器的性能。接下来,我们将详细介绍这款评估
    的头像 发表于 04-25 14:15 641次阅读

    探索LP8755EVM评估模块:从快速设置到深入测试

    探索LP8755EVM评估模块:从快速设置到深入测试 在电子设备的电源管理领域,德州仪器(TI)的LP8755多相6核降压转换器是款高性能的解决方案。为了帮助工程师更好地评估和使用这款芯片,TI
    的头像 发表于 04-21 15:20 220次阅读

    使用PYTHON进行的跨平台仿真

    如何使用编程语言Python来调用和控制VirtualLab Fusion中的模拟。请查看下面链接的文档,以找到关于如何设置和使用Python和VirtualLab Fusion之间的接口的详细指南,以及
    发表于 04-02 08:21

    [VirtualLab] 使用Python运行VirtualLab Fusion光学仿真

    使用代码编辑器Visual Studio Code(VS Code),因为它提供了用户友好的安装工作流程*。当然,如果需要,也可以使用其他Python编辑器。 对于使用VS Code的用户: 1.1
    发表于 03-31 09:39

    [VirtualLab] 使用Python进行跨平台参数扫描

    ** 准备Python **配置路径 ** **在VirtualLab Fusion中定义光学设置 ** **保存光学设置并导出参数
    发表于 03-31 09:36

    飞凌嵌入式ElfBoard-文件的时间属性

    在前面的struct stat结构体中的参数基本介绍完毕,还有最后属性,是文件的时间属性,时间属性都包括如下内容:结构体字段说明stru
    发表于 12-20 08:43

    没有专利的opencv-python 版本

    GUI 依赖,且默认禁用 nonfree 专利模块),版本需与核心版致: # 先安装核心版,再安装配套 contrib 无头版(避免专利风险) pip install opencv-python
    发表于 12-13 12:37

    智能显示模块怎么在显示工程中给寄存器设置初始值?我想给变量上电的默认值该如何设置

    智能显示模块怎么在显示工程中给寄存器设置初始值?我想给变量上电的默认值该如何设置
    发表于 12-11 09:54

    智能显示模块怎么在显示工程中给寄存器设置初始值?我想给变量上电的默认值该如何设置

    智能显示模块怎么在显示工程中给寄存器设置初始值?我想给变量上电的默认值该如何设置
    发表于 12-06 10:20

    Python调用API教程

    不同系统之间的信息交互。在这篇文章中,我们将详细介绍Python调用API的方法和技巧。 、用Requests库发送HTTP请求 使用Python调用API的第
    的头像 发表于 11-03 09:15 1313次阅读

    商品类目属性查询接口技术实现详解

    ​   、接口核心功能 该接口用于查询电商系统中商品类目的属性信息,支持: 按类目ID查询属性集合 按属性类型过滤(关键属性$K$、销售
    的头像 发表于 10-11 15:43 686次阅读
    商品类目<b class='flag-5'>属性</b>查询接口技术实现详解

    termux如何搭建python游戏

    戏开发流程 以Pygame为例,创建基础窗口: ```python import pygame pygame.init() screen = pygame.display.set_mode
    发表于 08-29 07:06

    GM910 条码识读模块用户设置手册

    电子发烧友网站提供《GM910 条码识读模块用户设置手册.pdf》资料免费下载
    发表于 07-09 14:57 0次下载

    Keysight是德示波器的5触发设置与波形分析方法

    Keysight是德示波器在电子测量领域应用广泛,精准的触发设置与高效的波形分析方法对获取准确信号信息至关重要。以下为您介绍5常用的触发设置及波形分析方法。   边沿触发设置  边沿
    的头像 发表于 06-27 16:00 1878次阅读
    Keysight是德示波器的5<b class='flag-5'>个</b>触发<b class='flag-5'>设置</b>与波形分析方法