Вопрос
Я пытаюсь положить некоторые сайты, которые я ползю в полку, но полки не примут никаких объектов сайта. Он примет списки, строки, кортежи, что у вас, но как только я поставил на объект сайта, он падает, когда я стараюсь получить содержание полки
Поэтому, когда я наполняю свои полки, как это:
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
Модуль делает).
Решение, как предполагает, что PDUE, состоит в том, чтобы обеспечить ссылку на обратную совместимость на класс в том же месте, которое оно раньше было, так что pickle
могу найти это. Если вы повторно сохраните все объекты, тем самым восстановив соленья, вы можете удалить это обратную к счастью.
Другие советы
Похоже, что Python ищет конструктор для объекта сайта и не находить его. Я не использовал Shalve, но вспоминаю правила для того, что можно замариваться, являются византийцами, и подозреваю, что правила на полки аналогичны.
Попробуйте добавить строку:
Сайт = sitemodule.site.
(с именем модуля, обеспечивающего «сайт»), прежде чем попробовать нерешивку. Это гарантирует, что класс сайта можно найти.