2017-01-17 136 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