Pergunta
Estou tentando colocar alguns sites que me arrastei em uma prateleira, mas a prateleira não aceitará nenhum objetivo. Ele aceitará listas, cordas, tuplas, o que você tem, mas assim que eu coloco um objeto de site, ele trava quando tento obter o conteúdo da Shelve
Então, quando eu preencho minha prateleira assim:
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']
funciona perfeitamente.
Mas se eu fizer isso:
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']
erros fora com esta mensagem de erro:
AttributeError: 'module' object has no attribute 'Site'
Estou completamente perplexo e, estranhamente, os Pythondocs também não têm muita informação. Tudo o que eles dizem é que a chave em uma prateleira deve ser uma string, mas o valor ou os dados podem ser "um objeto arbitrário"
Solução
Parece que você refatorou seu código depois de salvar objetos na prateleira. Ao recuperar objetos da Shelve, Python reconstrói o objeto e precisa encontrar a classe original que, presumivelmente, você se moveu. Este problema é típico ao trabalhar com pickle
(Enquanto o shelve
módulo faz).
A solução, como Pduel sugere, é fornecer uma referência de compatibilidade com versões anteriores à classe no mesmo local em que costumava ser, de modo que pickle
pode encontrá -lo. Se você salvá-los novamente, reconstruindo os picles, poderá remover essa referência de compensação versária.
Outras dicas
Parece que Python está procurando um construtor para um objeto 'site' e não encontrá -lo. Eu não usei a Shelve, mas lembro -me das regras para o que pode ser em conserva são bizantinas e suspeito que as regras da Shelve sejam semelhantes.
Tente adicionar a linha:
Site = sitemodule.site
(com o nome do módulo que fornece 'site') antes de tentar desligar. Isso garante que uma classe do site possa ser encontrada.