将python2转换为python3 getattribute

时间:2017-02-14 13:29:34

标签: python python-3.5

我的脚本在Python3上运行了一个递归循环,我尝试用iteritems替换items但是它没有解决问题,Python2运行正常..是否有一些变化{ {1}}我不知道?

__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

1 个答案:

答案 0 :(得分:0)

您在这里有无限递归,因为__getattribute__正在调用hasattr() the documentation个状态通过调用getattr()来工作(因此调用您的班级__getattribute__)。< / p>

您不得在hasattr()中致电__getattribute__

documentation for __getattribute__注意到这种无限递归的潜力,并为解决方案提供了指导:

  

为了避免此方法中的无限递归,它的实现应该总是调用具有相同名称的基类方法来访问它需要的任何属性,例如,object。 getattribute (self,name )。