2010-04-08 4 views
2

Я пытаюсь поместить некоторые сайты, которые я сканировал в полку, но полка не примет никаких объектов Сайта. Он будет принимать списки, строки, кортежи, что у вас есть, но как только я помещаю объект сайта, он падает, когда я пытаюсь получить содержимое полки.shelve дает странную ошибку

Итак, когда я заполняю свой полк, как это :

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, как ни странно, не так много информации или. Все они говорят, что ключ в полке должен быть строкой, но значение или данные могут быть «произвольным объектом»

ответ

5

Похоже, что вы отредактировали свой код после сохранения объектов в полке. При извлечении объектов из полки Python восстанавливает объект, и ему нужно найти оригинальный класс, который, предположительно, вы переместили. Эта проблема типична при работе с pickle (как это делает модуль shelve).

Решение, как предлагает pduel, заключается в предоставлении ссылки обратной совместимости классу в том же месте, в котором оно было раньше, так что pickle может его найти. Если вы повторно сохраните все объекты, тем самым восстановив соленые огурцы, вы можете удалить это рефери с обратной связью.

0

Кажется, что Python ищет конструктор для объекта «Сайт», а не найдя его. Я не использовал полки, но я помню, правила для того, что можно мариновать, являются византийскими, и подозревают, что правила полки похожи.

Попробуйте добавить строку:

Site = sitemodule.Site

(с именем модуля, обеспечивающего 'Сайт'), прежде чем пытаться unshelving. Это гарантирует, что класс сайта может быть найден.

Смежные вопросы