使用python'搁置'的例外情况字典分配

时间:2013-06-01 19:21:19

标签: python shelve pickle

在shelve模块中看到一个奇怪的异常(以及shelve helper copy_reg模块)。看一下,它试图调用一个对Pickler类的__getstate__方法的引用。但是,由于某种原因,似乎已经返回了None。只是想知道是否有其他人经历过这种情况,是否有可以做些什么来搁置正常工作?

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

  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 .__ getstate__分配给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

1 个答案:

答案 0 :(得分:0)

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