2013-06-01 258 views
0

在擱置模塊(以及擱置助手copy_reg模塊)中看到一個奇怪的例外。看一看,它試圖調用Pickler類的__getstate__方法的引用。然而,由於某種原因,這似乎沒有返回「無」。只是想知道是否有其他人已經經歷過這種情況,如果有什麼可以做到讓擱置工作正常?使用python'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 .__ 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 
+2

如果您發佈引發異常的實際代碼,可能會更有幫助。通過這種方式,我們可以看到異常的上下文是什麼,並幫助您,而不僅僅是看到模塊的代碼本身。 – pswaminathan

+0

我編輯了原始問題以包含導致問題的代碼行。正如我所說,我的代碼似乎沒有錯。 'search'變量是一個設置爲'/ unittest'的字符串,'ent'是......哦,這是一個包裝字典的類,所以可能不會被醃製。但是,我會認爲這會在Pickler試圖醃製它時引發異常。 – Craig

回答

0

價值感分配給貨架字典不是可複製的對象。我解決了這個問題,推遲了字典的封裝,直到它被緩存。