2017-02-14 12 views
2

私のスクリプトはPython3の再帰的ループに入りますが、iteritemsitemsに置き換えようとしましたが、Python2がうまく動作しません... __getattribute__に変更がありますか?実行するとpython2をpython3に変換するgetattribute

class Map(object):  
    def __init__(self, *args, **kwargs): 
     for arg in args: 
      if isinstance(arg, dict): 
       for k, v in arg.items(): 
        self.__dict__[k] = v 
        self.__dict__['_' + k] = v 

     if kwargs: 
      for k, v in kwargs.items(): 
       self.__dict__[k] = v 
       self.__dict__['_' + k] = v 

    def __getattribute__(self, attr): 
     if hasattr(self, 'get_' + attr): 
      return object.__getattribute__(self, 'get_' + attr)() 
     else: 
      return object.__getattribute__(self, attr) 

    def get(self, key): 
     try: 
      return self.__dict__.get('get_' + key)() 
     except (AttributeError, TypeError): 
      return self.__dict__.get(key) 


Map(**{'hello': 'world', 'foo': 'bar'}) # infinite recursion 

が、これは生産:あなたの__getattribute__が(そのため、あなたのクラスの__getattribute__呼び出し)getattr()を呼び出すことによってhasattr()the documentation状態の作品を呼び出しているので、あなたがここに無限再帰を持って

Traceback (most recent call last): 
    File "demo.py", line 29, in <module> 
    Map(**{'hello': 'world', 'foo': 'bar'}) # recursive loop 
    File "demo.py", line 13, in __init__ 
    self.__dict__[k] = v 
    File "demo.py", line 17, in __getattribute__ 
    if hasattr(self, 'get_' + attr): 
    File "demo.py", line 17, in __getattribute__ 
    if hasattr(self, 'get_' + attr): 
[...] 
RecursionError: maximum recursion depth exceeded 
+0

問題を再現するテストコードを提供できますか? – cdarke

+0

@cdarke hasattr(self、 'get_' + attr)と思われる:代わりにAttributeErrorでtry/except節を使ってPY3の問題を修正する – pietklerks

答えて

0

__getattribute__hasattr()と電話をかけてはいけません。

この方法で無限再帰を避けるために、その実装は常にアクセスに同じ名前の基底クラスのメソッドを呼び出す必要があります:

documentation for __getattribute__ノート無限再帰のために、この可能性とは、ソリューションに関するガイダンスを提供しますオブジェクトなど必要な属性。 getattribute(自己、名前)。

関連する問題