我正在尝试将我抓取的一些网站放入搁架,但搁架不会接受任何网站对象。它会接受列表,字符串,元组,你有什么,但是当我放入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也没有多少信息。他们所说的只是搁架中的钥匙必须是一个字符串,但价值或数据可以是“任意对象”
答案 0 :(得分:5)
看起来你在托架中保存对象后重构了代码。从托架中检索对象时,Python会重建对象,并且需要找到原来的类,可能是你已经移动了。使用pickle
时,这个问题很常见(正如shelve
模块所做的那样)。
正如pduel建议的那样,解决方案是在与以前相同的位置提供对类的向后兼容性引用,以便pickle
可以找到它。如果您重新保存所有对象,从而重建泡菜,则可以删除该向后兼容性参考。
答案 1 :(得分:0)
似乎Python正在寻找“Site”对象的构造函数,而不是找到它。我没有使用搁置,但我记得可以腌制的规则是拜占庭,并且怀疑搁置规则是相似的。
尝试添加以下行:
Site = sitemodule.Site
在尝试取消搁置之前,(提供“网站”的模块名称)。这确保了可以找到Site类。