python - 搁置给出奇怪的错误

标签 python shelve

我正在尝试将我爬行的一些网站放入架子中,但架子不接受任何站点对象。它会接受列表、字符串、元组等等,但是一旦我放入 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'

我完全被难住了,奇怪的是,Python 文档也没有太多信息。他们所说的只是架子中的键必须是字符串,但值或数据可以是“任意对象”

最佳答案

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

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

关于python - 搁置给出奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2601081/

相关文章:

python - 迭代/循环搁置

perforce - 如何在搁置它的更改列表中检查 perforce 搁架?

python - 在数据库中存储 700 万个键的 python 字典

Python:如何保持与实例的独立性?

python - 将列中的值替换为列表中的值并按索引

python - 在 DataFrame 中创建新行的最有效方法

python - 保存按键排序的类似 Shelf Dictionary 的对象

python - 搁置代码给出 KeyError

python - 最小化Python函数,在小区间内保持恒定

python - 如何获取 n 维嵌套列表中元素的索引