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安装: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']不再与dictionary['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.Properties,如key,item等。Addit不会让你覆盖dict的属性,所以下面的操作将不起作用:>>>mapping=Dict()>>>mapping.keys=2Traceback(mostrecentcallast):File"",line1,inFile"addict/addict.py",line53,in__setattr__raiseAttributeError("'Dict'objectattribute'%s'isread-only"%name)AttributeError:'Dict'objectattribute'keys'是只读的但是,使用下面的方法:>>>a=Dict()>>>a['keys']=2>>>a{'keys':2}>>>a['keys']25.防御对于不在字典中的键,aultValueAddit的行为类似于defaultdict(Dict),因此丢失的键返回一个空的Dict而不是抛出KeyError如果不需要此行为,您可以使用下面的方法恢复抛出KeyError:>>>classDictNoDefault(Dict):>>>def__missing__(self,key):>>>raiseKeyError(key)但请注意,这样会失去速记赋值功能(addicted.a.b.c.d.e=2)6.Converttoaregulardictionary如果觉得将Addict传递给其他函数或模块不安全,请使用to_dict()方法,该方法会将Addict转换为正则字典>>>regular_dict=my_addict.to_dict()>>>regular_dict.a=2Traceback(mostrecentcallast):File"",line1,inAttributeError:'dict'objecthasnoattribute'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'}]如果你想用eyeseyes计算出生性别的gender有多少人出生,你可以很容易地计算出这个信息:counter=Dict()forrowindata:born=row['born']gender=row['gender']eyes=row['eyes']counter[born][gender][eyes]+=1print(counter)#result:{1980:{'M':{'blue':1,'green':3},'F':{'blue':1,'green':1}},1981:{'M':{'blue':2,'green':1},'F':{'blue':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。瘾君子是怎么来的?这个模块完全是从在Python中创建Elasticsearch查询的繁琐过程开发的。每当您发现自己编写复杂的字典逻辑时,请记住您不必这样做,请使用Addict。我们的文章到此结束,如果喜欢今天的Python实战教程,请继续关注我们!