当给定复合键时,递归地设置Python dict项';foo.bar.baz';

当给定复合键时,递归地设置Python dict项';foo.bar.baz';,python,dictionary,recursion,Python,Dictionary,Recursion,我希望实现以下目标: foodict['foo.bar.baz'] = 'foo' { 'foo': { 'bar': { 'baz': 'foo' } } } } …递归创建密钥 挠头一段时间后,我想到了这个: 类配置(dict): 定义初始化(self,*args,**kwargs): self.super=super(配置,self) 自我更新(*args,**kwargs) 定义设置项(自身、键、值): k

我希望实现以下目标:

foodict['foo.bar.baz'] = 'foo'
{
   'foo': {
      'bar': {
            'baz': 'foo'
         }
       }
   }
}
…递归创建密钥

挠头一段时间后,我想到了这个:

类配置(dict):
定义初始化(self,*args,**kwargs):
self.super=super(配置,self)
自我更新(*args,**kwargs)
定义设置项(自身、键、值):
keys=keys.split(“.”)
键。反向()
config=config()
对于枚举中的i,k(键):
如果i==0:
config=config(**{k:value})
其他:
config=config(**{k:config})
self.super.update(配置)
< /代码> 你可以考虑Raymond Hettinger自己的“无限Debug”配方:

如果必须具有属性访问权限:

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':'foo'}}
?我的错,更新了这个问题。
枚举(键)
然后以不同的方式递归和处理第一个键的诡计很聪明,但看起来非常不明显,而且是手臂长度的递归。为什么不重写您的RecursiveDictClass.\uuuu setitem\uuuu()
以获取可选的键列表,并相应地递归?然后调用
foodict[(['foo','bar','baz'])
?您认为有更好的方法来声明它们(如使用的点分隔符)并覆盖
\uuuuu setitem\uuuuuuuuu
吗?我想我会继续!只需创建另一个助手函数来实现上述功能(用点声明的键)——有点像JS对象。@AchillesGasperRasquinhasure@AchillesGasperRasquinha添加了一个覆盖了
\uuuuuu setitem\uuuuuu
的实现
>>> 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'])