在现有的python脚本中,我使用生动的方式来处理字典。
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])但是,它确实不起作用,因为这种变化的范围是在函数中,而不是全局的……我不知道如何递归地进行此更改...
发布于 2017-01-18 00:31:24
只需在最后返回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然后使用like:
some_dict = upvivification(some_dict)只有在pain and care很好的情况下,才能更改现有对象突变样式的type。但是,您可以将旧变量重新分配给新对象。
发布于 2017-01-18 00:37:58
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)https://stackoverflow.com/questions/41702049
复制相似问题