在python 2.6中使用shelve模块时出现异常RuntimeError

时间:2012-09-11 11:02:55

标签: python runtime-error shelve

我正在使用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 函数被覆盖的原因。有没有办法写它而不是无限循环?

1 个答案:

答案 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