2017-02-14 78 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 

運行時,這將產生:

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__是通過調用getattr()(因此調用類的__getattribute__)調用hasattr()the documentation狀態下工作。

您不能在您的__getattribute__中致電hasattr()

documentation for __getattribute__筆記這個潛力無限循環,並提供有關解決方案的指導:

爲了避免這種方法無窮遞歸,其實施應始終調用基類方法具有相同的名稱訪問它需要的任何屬性,例如對象。 getattribute(self,name)。