搁置给出了奇怪的错误

时间:2010-04-08 15:15:54

标签: python shelve

我正在尝试将我抓取的一些网站放入搁架,但搁架不会接受任何网站对象。它会接受列表,字符串,元组,你有什么,但是当我放入Site-object时,它会在我试图获取搁架的内容时崩溃

所以,当我这样填满我的货架时:

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也没有多少信息。他们所说的只是搁架中的钥匙必须是一个字符串,但价值或数据可以是“任意对象”

2 个答案:

答案 0 :(得分:5)

看起来你在托架中保存对象后重构了代码。从托架中检索对象时,Python会重建对象,并且需要找到原来的类,可能是你已经移动了。使用pickle时,这个问题很常见(正如shelve模块所做的那样)。

正如pduel建议的那样,解决方案是在与以前相同的位置提供对类的向后兼容性引用,以便pickle可以找到它。如果您重新保存所有对象,从而重建泡菜,则可以删除该向后兼容性参考。

答案 1 :(得分:0)

似乎Python正在寻找“Site”对象的构造函数,而不是找到它。我没有使用搁置,但我记得可以腌制的规则是拜占庭,并且怀疑搁置规则是相似的。

尝试添加以下行:

Site = sitemodule.Site

在尝试取消搁置之前,

(提供“网站”的模块名称)。这确保了可以找到Site类。