在现有的python脚本中,我使用vivification来处理字典词典。
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __init__(self, *args, **kwargs):
super(AutoVivification, self).__init__(*args, **kwargs)
self.vivify = True
self.root = self
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
if not self.root.vivify:
raise
value = self[item] = type(self)()
value.root = self.root
return value
def unvivify(self):
self.vivify = False
def revivify(self):
self.vivify = True
def upgrade(self):
self.root = self
我想在字典词典中为每个字典应用此类。我想到了类似的东西:
def upvivification(dico):
"""Upgrade to the last autovivification version."""
if isinstance(dico, dict):
dico = AutoVivification(dico)
for k in dico:
if isinstance(dico[k], dict):
upvivification(dico[k])
但是,确实它没有用,因为这个改变的范围在于函数而不是全局...我不知道如何递归地进行这种改变......
答案 0 :(得分:1)
最后返回dico并在递归调用中重新分配返回值:
def upvivification(dico):
if isinstance(dico, dict):
dico = AutoVivification(dico)
for k in dico:
if isinstance(dico[k], dict):
dico[k] = upvivification(dico[k])
return dico
然后使用:
some_dict = upvivification(some_dict)
只能使用优秀pain and care更改现有对象变异样式的type
。但是,您可以将旧变量重新分配给新对象。
答案 1 :(得分:1)
def upvivification(dico):
"""Upgrade to the last autovivification version."""
if isinstance(dico, dict):
dico = AutoVivification(dico)
for k in dico:
if isinstance(dico[k], dict):
dico[k] = upvivification(dico[k])
return deco
并像
一样使用它new_dico = upvivification(dico)