使用python的异常';货架';词典赋值

使用python的异常';货架';词典赋值,python,shelve,pickle,Python,Shelve,Pickle,在shelve模块中看到一个奇怪的异常(shelve helper copy_reg模块)。看一看,它正试图调用一个引用,该引用应该是Pickler类的uuu getstate_uuu方法。然而,出于某种原因,这似乎没有回报。我只是想知道是否有其他人也经历过这种情况,是否有什么方法可以让shelve正常工作 下面是我看到的异常的返回堆栈: File "/usr/local/lib/python2.7/dist-packages/libgsync/drive/__init__.py", lin

在shelve模块中看到一个奇怪的异常(shelve helper copy_reg模块)。看一看,它正试图调用一个引用,该引用应该是Pickler类的uuu getstate_uuu方法。然而,出于某种原因,这似乎没有回报。我只是想知道是否有其他人也经历过这种情况,是否有什么方法可以让shelve正常工作

下面是我看到的异常的返回堆栈:

  File "/usr/local/lib/python2.7/dist-packages/libgsync/drive/__init__.py", line 497, in stat
    self._pcache[search] = ent
  File "/usr/lib/python2.7/shelve.py", line 132, in __setitem__
    p.dump(value)
  File "/usr/lib/python2.7/copy_reg.py", line 84, in _reduce_ex
    dict = getstate()
DEBUG:      libgsync/drive/__init__.py:387:walk(): Exception: 'NoneType' object is not callable
我冒昧地查看了代码,下面是它出现故障的地方,在_reduce_ex()函数中:

try:
    getstate = self.__getstate__
except AttributeError:
    if getattr(self, "__slots__", None):
        raise TypeError("a class that defines __slots__ without "
                        "defining __getstate__ cannot be pickled")
    try:
        dict = self.__dict__
    except AttributeError:
        dict = None
else:
    dict = getstate()
最初,它将self.\uuu getstate\uuuu分配给getstat,因此此时应该可以调用它。它似乎没有引发异常,因为它是在else块的上下文中执行的。奇怪

以下是发生异常的代码行的调试输出:

DEBUG:        libgsync/drive/__init__.py:496:stat(): Updating path cache: /unittest
下面是导致异常的代码:

# Update path cache.
if self._pcache.get(search) is None:
    debug("Updating path cache: %s" % search)
    self._pcache[search] = ent

分配给工具架词典的值不是可复制对象。我通过将字典的类包装推迟到缓存之后解决了这个问题。

如果您发布引发异常的实际代码,可能会更有帮助。这样我们就可以看到异常的上下文和帮助,而不仅仅是看到模块的代码本身。正如我所说,我的代码似乎没有什么问题。“search”变量是设置为“/unittest”的字符串,“ent”是。。。哦,等等,这是一个包装字典的类,所以可能不能被腌制。然而,我本以为当pickler试图对其进行pickle时,会抛出一个异常。