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"

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top