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

    关注

    57

    文章

    4856

    浏览量

    89554

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LABVIEW 2023 Q1调用python直报错1671

    LABVIEW 2023Q1调用python直报错1671报错信息:PythonNode_AddTwoDoubles.vi中的打开Python会话Python returned
    发表于 11-12 09:51

    Python调用API教程

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

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

    ​   、接口核心功能 该接口用于查询电商系统中商品类目的属性信息,支持: 按类目ID查询属性集合 按属性类型过滤(关键属性$K$、销售
    的头像 发表于 10-11 15:43 250次阅读
    商品类目<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次下载

    【BPI-CanMV-K230D-Zero开发板体验】+灯效控制与Python编程

    BPI-CanMV-K230D-Zero开发板易于开发的大特定在于它系统内置了Python,因此不在仅依赖于在LINUX下开发。此外,随着AI智能技术的推进,Python的使用也越来越广泛。 为此
    发表于 06-27 17:33

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

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

    零基础入门:如何在树莓派上编写和运行Python程序?

    在这篇文章中,我将为你简要介绍Python程序是什么、Python程序可以用来做什么,以及如何在RaspberryPi上编写和运行简单的Pyth
    的头像 发表于 03-25 09:27 1516次阅读
    零基础入门:如何在树莓派上编写和运行<b class='flag-5'>Python</b>程序?

    Python在嵌入式系统中的应用场景

    你想把你的职业生涯提升到新的水平?Python在嵌入式系统中正在成为股不可缺少的新力量。尽管传统上嵌入式开发更多地依赖于C和C++语言,Pyt
    的头像 发表于 03-19 14:10 1184次阅读

    运行OVModelForCausalLM Python模块时出错了,怎么解决?

    创建了自定义 Python* 代码,类似于遵循 240-dolly-2-instruction 的 Jupyter 笔记本。 OVModelForCausalLM Python
    发表于 03-05 06:44

    设置让 KiCad 的视觉体验提升档次!

    “  不知道您有没有感觉到无论是原理图还是PCB,KiCad 没有商业软件看上去那么清晰?其实只需要手动改下这个设置,瞬间让您的视觉体验提升档次!  ”     使用 KiCad
    的头像 发表于 02-17 11:17 1538次阅读
    <b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>设置</b>让 KiCad 的视觉体验提升<b class='flag-5'>一</b><b class='flag-5'>个</b>档次!

    深入探索GCC的attribute属性

    如果经常看Linux源码,定会见过 attribute 属性,他在 Linux 里面出现的很多。 attribute 是 gcc 的扩展功能,它不属于标准C语言。 使用 attribute 可以
    的头像 发表于 02-13 10:05 786次阅读

    操作指南:pytorch云服务器怎么设置

    设置PyTorch云服务器需选择云平台,创建合适的GPU实例,安装操作系统、Python及Anaconda,创建虚拟环境,根据CUDA版本安装PyTorch,配置环境变量,最后验证安装。过程中需考虑
    的头像 发表于 02-08 10:33 603次阅读

    使用Python实现xgboost教程

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

    Chart FX-使用API传输数据 使用Value属性传输数据

    有时,向 Chart FX 传输数值数据最简单方便的方法就是使用 Value 属性。通过 Value 属性,您可以为图表中特定series中的某point设置数值。 Value
    的头像 发表于 01-09 16:30 629次阅读
    Chart FX-使用API传输数据 使用Value<b class='flag-5'>属性</b>传输数据