我正在使用shelve模块为我的程序添加一些持久性。起初我在搁置中使用默认的bsddb但我不得不将其更改为gdbm,然后更改异常发生:
Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type 'exceptions.AttributeError'> ignored
似乎是由anydbm模块引发(并捕获)了一些db调用。
它没有什么坏处,因为代码完成没有问题,但它看起来有点糟糕。据我所知,我可以使用警告模块来抑制打印,但我想完全删除异常。
我正在寻找其他地方的类似问题(它们出现在pylint,django和其他一些模块/包中),而且它似乎被标记为“bug”。有没有人在anydbm / shelve模块中提出这种行为的解决方案?
EDIT1。 我发现导致此错误的原因是: def getattr (self,attr): return getattr(self.config,attr)
我正试图挽救一个包裹另一个类的类 - 这就是为什么 getattr 函数被覆盖的原因。有没有办法写它而不是无限循环?
答案 0 :(得分:1)
好吧,我想我设法解决了这个问题。问题是包装类没有 setstate 和 getstate 功能。到目前为止似乎有效。被包装的类不需要 setstate 和 getstate 。
我为包装类使用了简单的getstate和setstate函数:
def __getstate__(self):
'''
Getstate for pickle (used by shelve module)
'''
return self.__dict__
def __setstate__(self, dictionary):
'''
Setstate for pickle (used by shelve module)
'''
self.__dict__ = dictionary