python list按照某个字段排序,python list嵌套list
属性树
第一个规范的问题是,Python无法在__getitem__中判断,如果在我的时,下一步将继续深入到不存在的树中,在这种情况下,它需要返回一个带有__getitem__方法的对象,这样就不会向您抛出AttributeError,或者如果您想要一个值,在这种情况下,它需要返回没有。
我认为在上面的每一种情况下,您应该期望它抛出一个KeyError,而不是返回没有。原因是你无法判断没有人是否意味着"没有密钥"或者"有人实际存储了没有人在那个位置"。对于此行为,您只需采取溺爱,删除记号笔,并将__getitem__替换为:def __getitem__(self,key):
返回自己[键]
因为你真正想要的是一个带__getattr__和__setattr__的字典。
可能有一种方法可以完全删除__getitem__,并说一些类似__getattr__=字典.__getitem__的话,但我认为这可能是过度优化,如果您以后决定要__getitem__按照原来的溺爱方式创建树,那么这将是一个问题,在这种情况下,您可以将其更改为:def __getitem__(self,key):
如果密钥不在自身中:
迪克特. self _ _ setitem _ _(self,key,dotdictify())
返回字典__getitem__(self,key)
我不喜欢原来的标记业务。
路径支持
第二个规范(覆盖获取()和set())是一个普通的词典有一个get(),它的操作与您描述的不同,甚至没有一个设置(尽管它有一个setdefault(),这是获取()的逆操作)。人们希望得到接受两个参数,如果找不到密钥,则第二个参数是默认值。
如果要扩展__getitem__和__setitem__来处理点键表示法,则需要将doctictify修改为:class dotdictify(dict):
def __init__(self,value=None):
如果值为无:
及格
elif isinstance(value,dict):
对于键入值:
自我. setitem__(key,value[key])
否则:
引发类型错误,预期字典
def __setitem__(self,key,value):
如果"."调:
myKey,restOfKey=key.split( . )), 1)
target=self.setdefault(myKey,dotdictify())
如果不是isinstance(target,dotdictify):
引发KeyError,无法设置“%s”(在“% s”(% s)%(restof key,myKey,repr(target))中)
target[restOfKey]=值
否则:
如果是isinstance(值,字典)而不是isinstance(value,dotdictify):
value=dotdictify(值)
迪克特. setitem__(自身,关键字,值)
def __getitem__(self,key):
如果"."不在调中:
返回字典__getitem__(self,key)
myKey,restOfKey=key.split( . )), 1)
目标=字典__getitem__(self,myKey)
如果不是isinstance(target,dotdictify):
引发KeyError,无法获取“%s”在“% s”(% s)%(restof key,myKey,repr(target))中
返回目标[恢复键]
def __contains__(self,key):
如果"."不在调中:
返回字典。__包含_ _(自身,密钥)
myKey,restOfKey=key.split( . )), 1)
目标=字典__getitem__(self,myKey)
如果不是isinstance(target,dotdictify):
返回错误的
在目标中返回restOfKey
def setdefault(self,key,default):
如果密钥不在自身中:
self[key]=默认
返回自己[键]
__setattr__=__setitem__
__getattr__=__getitem__
测试代码:life=dotdictify({ 大爆炸:{ 恒星:{ 行星:{ } })
生命,大爆炸,恒星,行星
{}
生活。大爆炸。星星。行星。earth={ 单细胞生命:{ } }
生命,大爆炸,恒星,行星
{ 地球:{ 单细胞生命:{}}}
生命[大爆炸。恒星。行星。火星。登陆者。维京人]=2
生命。大爆炸。恒星。行星。火星。登陆者。维京人
2
生活中的登陆者、维京人、大爆炸、恒星、行星、火星
真实的
生活。得到(‘大爆炸。星星。行星。火星。兰德斯。精神,真实)
真实的
生活。设置默认(‘大爆炸。星星。行星。火星。兰德斯。“机会”,真)
真实的
着陆器。生命中的机遇。大爆炸。恒星。行星。火星
真实的
生命。大爆炸。恒星。行星。火星
{landers: {opportunity: True, vikings: 2}}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。