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