Addit是一个Python模块。除了提供标准的字典语法外,Addit生成的字典的值可以使用属性获取或设置。这意味着您不必再像这样编写字典:body={'query':{'filtered':{'query':{'match':{'description':'addictive'}},'filter':{'filter''term':{'created_by':'Mats'}}}}相反,您可以简单地编写以下三行代码:body=Dict()body.query.filtered.query.match.description='addictive'body.query.filtered.filter.term.created_by='Mats'1.要安装,您可以通过pip安装:pipinstalladdict或通过conda:condainstalladdict-cconda-forgeAddit在Python2.7+上并且Python3可以运行。2.用法Addict继承自dictionary,但在获取和设置其值上更加灵活。使用Addict词典是一种乐趣!\设置嵌套字典的项目非常舒服:>>>fromaddictimportDict>>>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].b3但映射['a']不再与字典['a']相同。>>>mapping['a']isdictionary['a']False当然这个特性仅限于构造函数,在使用属性或者设置值的时候是不行的:>>>a=Dict()>>>b=[1,2,3]>>>a.b=b>>>a.bisbTrue3.需要记住的事情请记住int不是有效的属性名称,因此您必须使用get/setitem语法来设置/获取非字符串字典键:>>>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。e24。键、项等属性。Addit不会让您覆盖字典的属性,因此以下内容不起作用:>>>mapping=Dict()>>>mapping.keys=2Traceback(mostrecentcalllast):File“”,第1行,在文件“addict/addict.py”,第53行,在__setattr__中raiseAttributeError(“‘Dict’对象属性‘%s’是只读的”%name)AttributeError:'Dict'对象属性'keys'是只读的但是,使用下面的方法:>>>a=Dict()>>>a['keys']=2>>>a{'keys':2}>>>a['keys']25.默认值不在word中dict,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=2Traceback(mostrecentcalllast):File"",line1,inAttributeError:'dict'objecthasnoattribute'a'whenyouwanttocreatenesteddictionariesinafewlinescodeandthensendthemtodifferent这对函数或模块非常有用:body=Dict()body.query.filtered.query.match.description='上瘾'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'},{'出生':1981,'性别':'M','眼睛':'蓝色'},{'出生':1981,'性别':'F','眼睛':'蓝色'},{'born':1981,'gender':'M','eyes':'green'},{'born':1981,'gender':'F','eyes':'blue'}]如果你要计算Howmanypeoplewereborninthegenderoftheborngender使用眼睛眼睛,你可以很容易地计算出这些信息:counter=Dict()forrowindata: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,'绿色':1},'F':{'蓝色':2,'绿色':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。这是我们文章的结尾。如果喜欢今天的Python实战教程,可以关注公众号:Python编程学习圈,了解更多编程技术知识!