题
我试图把一些网站我爬进了一个货架,但货架不会接受任何网站对象。它将接受列表,字符串,元组,你有什么,但只要我把一个站点对象,它崩溃的时候我试图让货架
内容所以,当我填写了我的货架是这样的:
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,奇怪的是,没有太多的信息无论是。所有他们说的是,在一个搁置键必须是一个字符串,但值或数据可以是“任意物体”
解决方案
看起来你在货架保存对象后,重构你的代码。当从货架检索对象,Python的重建对象,它需要找到,想必,你已经将原本的类。与pickle
工作时(作为shelve
模块所做的)此问题是典型的。
的溶液,如pduel所暗示的,是提供在相同的位置,这曾经是一个向后兼容性参照类,以便pickle
可以找到它。如果您重新保存所有对象,从而重建泡菜,你可以删除向后comatibility referece。
其他提示
看来,Python是寻找一个“站点”对象的构造,并没有发现它。我没有用货架,但我记得什么可以腌制是拜占庭式的规则,并怀疑货架规则类似。
尝试添加行:
网站= sitemodule.Site
(与模块提供“网站”的名称),然后再尝试unshelving。这确保了站点类可以找到。
不隶属于 StackOverflow