2017-01-17 135 views
0

在现有的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

什么是** **的变化在* “这种变化的范围是在函数” *?你的意思是更新作为参数传递的'dico'字典吗? –

+0

此外,'upvivification'函数是否在'AutoVivification'类或其外部? –

+0

是的,它是更新作为参数传递的dico。 – servoz

回答

1

只返回迪科和重新分配你的递归调用的返回值:

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) 

只有改变type现有的对象突变风格与伟大的pain and care只可能。但是,您可以将旧变量重新分配给新对象。

+0

哦,太棒了!正是我期待的......我想我需要睡觉......非常感谢...... – servoz

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) 
+0

哦,太棒了!正是我期待的......我想我需要睡觉......非常感谢.... – servoz