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

ただ、最後に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を変更することのみ可能です。ただし、古い変数を新しいオブジェクトに再割り当てすることはできます。

+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

Oh great !!!!まさしく私が探していたもの...そして私は眠る必要があると思う...たくさんありがたい.... – servoz