2010-04-08 121 views
2

我試圖把一些網站我爬到擱置,但擱置不會接受任何網站對象。它會接受列表,字符串,元組,你有什麼,但只要我把一個Site對象,它崩潰時,我試圖獲得擱置的內容擱置給出奇怪的錯誤

所以,當我填滿我這樣的擱置:

def add_to_shelve(self, site): 
    db = shelve.open("database") 
    print site, site.url 
    for word in site.content: 
     db[word] = site.url #site.url is a string, word has to be one too 

shelve.open("database")['whatever']完美地工作。

但是,如果我這樣做:

def add_to_shelve(self, site): 
    db = shelve.open("database") 
    print site, site.url 
    for word in site.content: 
     db[word] = site #site is now an object of Site 

shelve.open("database")['whatever']錯誤出與此錯誤消息:

AttributeError: 'module' object has no attribute 'Site' 

我完全難住了,和PYTHONDOCS,奇怪的是,沒有太多的信息無論是。他們說的是,貨架上的鑰匙必須是一個字符串,但價值或數據可以是「任意物體」

回答

5

它看起來像在保存擱置中的對象之後重構了代碼。當從貨架上檢索對象時,Python會重建對象,並且它需要找到原本可能已移動的類。使用pickle時(與shelve模塊一樣),此問題很常見。

這個解決方案,正如pduel所建議的,是在類似的位置提供一個向後兼容的參考,以便pickle可以找到它。如果您重新保存所有對象,從而重建鹹菜,則可以刪除該向後兼容引用。

0

似乎Python正在尋找一個'Site'對象的構造函數,而不是找到它。我沒有使用擱置,但我記得可以醃製的規則是拜占庭,並且懷疑擱置規則是相似的。

嘗試添加一行:

網站= sitemodule.Site

(與模塊提供 '網站' 的名稱),然後再嘗試unshelving。這確保可以找到Site類。