给定复合键’foo.bar.baz’时,递归设置Python dict项
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了给定复合键’foo.bar.baz’时,递归设置Python dict项,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1793字,纯文字阅读大概需要3分钟。
内容图文
![给定复合键’foo.bar.baz’时,递归设置Python dict项](/upload/InfoBanner/zyjiaocheng/700/881efef392144b74a183b19bc6cddb97.jpg)
我想实现以下目标:
foodict['foo.bar.baz'] = 'foo'
{
'foo': {
'bar': {
'baz': 'foo'
}
}
}
}
…递归创建密钥.
抓了一会儿之后,我想出了这个:
class Config(dict):
def __init__(self, *args, **kwargs):
self.super = super(Config, self)
self.update(*args, **kwargs)
def __setitem__(self, keys, value):
keys = keys.split('.')
keys.reverse()
config = Config()
for i, k in enumerate(keys):
if i == 0:
config = Config(**{ k: value })
else:
config = Config(**{ k: config })
self.super.update(config)
解决方法:
您可以考虑Raymond Hettinger本人的“无限默认”食谱:
https://twitter.com/raymondh/status/343823801278140417
>>> from collections import defaultdict
>>> infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
>>> d = infinite_defaultdict()
>>> d['foo']['bar']['baz'] = 'foo'
>>> d
defaultdict(<function <lambda> at 0x1040388c8>, {'foo': defaultdict(<function <lambda> at 0x1040388c8>, {'bar': defaultdict(<function <lambda> at 0x1040388c8>, {'baz': 'foo'})})})
另一种选择是实现__missing__:
>>> class InfiniteDict(dict):
... def __missing__(self, val):
... d = InfiniteDict()
... self[val] = d
... return d
...
>>> d = InfiniteDict()
>>> d['foo']['bar']['baz'] = 'foo'
>>> d
{'foo': {'bar': {'baz': 'foo'}}}
如果您必须具有属性访问权限:
class InfiniteDict(dict):
def __missing__(self, val):
d = InfiniteDict()
self[val] = d
return d
def __getattr__(self, item):
return self.__getitem__(item)
def __setattr__(self, item, value):
super().__setitem__(item, value)
在行动:
>>> d = InfiniteDict()
>>> d.foo.bar.baz = 'foo'
>>> d
{'foo': {'bar': {'baz': 'foo'}}}
>>>
虽然,这有点快速和肮脏,所以不能保证没有任何错误.例如,与实际属性的碰撞几乎没有什么防范措施:
>>> d.keys = 'should I be allowed?'
>>> d
{'foo': {'bar': {'baz': 'foo'}}, 'keys': 'should I be allowed?'}
>>> d.keys()
dict_keys(['foo', 'keys'])
内容总结
以上是互联网集市为您收集整理的给定复合键’foo.bar.baz’时,递归设置Python dict项全部内容,希望文章能够帮你解决给定复合键’foo.bar.baz’时,递归设置Python dict项所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。