2

我正在尝试将我爬入的一些站点放入搁架,但搁架不接受任何站点对象。它会接受列表、字符串、元组,你有什么,但是一旦我放入一个站点对象,当我尝试获取搁置的内容时它就会崩溃

所以当我像这样填满我的架子时:

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

4

2 回答 2

5

看起来您在将对象保存在搁置中后重构了代码。当从搁置中检索对象时,Python 会重建对象,并且它需要找到您可能已经移动的原始类。这个问题在使用时很典型pickle(就像shelve模块一样)。

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

于 2010-04-08T20:12:20.390 回答
0

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

尝试添加该行:

站点 = 站点模块.站点

(使用提供“站点”的模块名称)在您尝试取消搁置之前。这确保可以找到站点类。

于 2010-04-08T17:12:36.390 回答