在Python2.6中使用搁置模块时出现异常运行时错误

在Python2.6中使用搁置模块时出现异常运行时错误,python,runtime-error,shelve,Python,Runtime Error,Shelve,我正在使用搁置模块为我的程序添加一些持久性。起初,我在搁置中使用默认的bsddb,但我必须将其更改为gdbm,更改后会出现异常: Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type 'exceptions.AttributeError'> ignored Exception RuntimeError:“忽略中的子检查中超过了最大递归深度”

我正在使用搁置模块为我的程序添加一些持久性。起初,我在搁置中使用默认的bsddb,但我必须将其更改为gdbm,更改后会出现异常:

    Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type       'exceptions.AttributeError'> ignored
Exception RuntimeError:“忽略中的子检查中超过了最大递归深度”
它似乎是由某个whichdb调用在anydbm模块中引发(并捕获)的

它没有做什么坏事,因为代码完成时没有问题,但看起来有点糟糕。据我所知,我可以使用警告模块来抑制打印,但是我想完全删除异常

我在其他地方也遇到过类似的问题(它们发生在pylint、django和其他一些模块/包中),而且似乎在任何地方都被标记为“bug”。有没有人在anydbm/shelve模块中找到了解决这种行为的方法

编辑1。 我发现导致此错误的原因是: defgetattr(自身,属性): 返回getattr(self.config,attr)


我试图将一个封装了另一个类的类保存到shelve中-这就是为什么getattr函数被覆盖的原因。有没有一种方法可以编写它而不产生无限循环?

好的,我想我已经解决了这个问题。问题是包装类没有setstategetstate函数。到目前为止,它似乎奏效了。包装类不需要setstategetstate

我对包装器类使用了简单的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

如果这发生在一个库中(就像它看起来那样),那么值得让作者知道。可能是个虫子,对吧?我的意思是,如果不完全确定递归限制永远不会得到满足,就不应该在Python中实现递归。我仍在寻找解决这个问题的方法。您知道我是否可以抑制RuntimeError异常打印?“警告”模块不工作(因为它不是警告,而是异常),我对此感到非常困惑。我不认为该程序的用户在每次发布产品时都希望看到异常。