Python pickle用getattr获得了acycle recursion?

时间:2014-04-01 09:33:26

标签: python pickle getattr

class Test(object):
    def __init__(self, a):
        self.a = a

    def __getattr__(self, name):
        return getattr(self.a, name)

from pickle import loads, dumps
loads(dumps((Test(something),)))

我得到了:

      7     def __getattr__(self, name):
----> 8         return getattr(self.a, name)

RuntimeError: maximum recursion depth exceeded

任何提示?

我可以通过更改代码来解决此问题:

if 'a' in self.__dict__:
    return getattr(self.a, name)

但我不想。有更好的解决方案吗?

谢谢

2 个答案:

答案 0 :(得分:1)

我使用getattr()代替__getattr__。这相当于调用getattr(Test(a).a, name)。首先转为a.__getattribute__,如果失败则转为a.__getattr__

class Test(object):
    def __init__(self, a):
        self._a = a

    def __getattr__(self, name):
        a = object.__getattribute__(self, '_a')
        return getattr(a, name)

答案 1 :(得分:0)

这应该有用,但我怀疑这是个好主意......

class Test(object):
    def __init__(self, a):
        self.a = a

    def __getattr__(self, name):
        a = object.__getattribute__(self, 'a')
        return a.__getattr__(a, name)

from pickle import loads, dumps
loads(dumps((Test({}))))
# <__main__.Test at 0x7f6beb8>