【问题标题】:Exception RuntimeError while using shelve module in python 2.6在 python 2.6 中使用搁置模块时出现异常 RuntimeError
【发布时间】:2013-02-21 14:22:59
【问题描述】:

我正在使用搁置模块为我的程序添加一些持久性。起初我在搁置中使用默认的 bsddb,但我不得不将其更改为 gdbm,然后发生异常:

    Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type       'exceptions.AttributeError'> ignored

它似乎是由一些 whichdb 调用在 anydbm 模块中引发(并捕获)的。

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

我正在查看其他地方的类似问题(它们发生在 pylint、django 和其他一些模块/包中)并且似乎在任何地方都被标记为“错误”。有没有人想出解决任何dbm / shelve模块中这种行为的方法?

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

我正在尝试将包装另一个类的类保存到搁置中 - 这就是 getattr 函数被覆盖的原因。有没有办法写不死循环?

【问题讨论】:

  • 如果这发生在库中(看起来像这样),值得让作者知道。可能是一个错误,对吧?我的意思是,如果不完全确定永远不会满足递归限制,则不应在 Python 中实现递归。
  • 是的,没错。我仍在寻找解决此错误的方法。你知道我是否可以抑制 RuntimeError 异常打印吗?警告模块不起作用(因为它不是警告而是异常),我在这里很困惑。我认为该程序的用户不会希望在每次启动产品时都看到异常。

标签: python runtime-error shelve


【解决方案1】:

好的,我想我设法解决了这个问题。问题是包装类没有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多