Domanda
Sto cercando di mettere alcuni siti ho strisciato in un ripiano, ma il ripiano non accetterà qualsiasi sito-oggetti. La volontà di accettare le liste, stringhe, tuple, quello che hai, ma non appena ho messo in un sito-oggetto, si blocca quando provo a ottenere il contenuto del ripiano
Così, quando mi riempio il mio ripiano in questo modo:
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']
funziona perfettamente.
Ma se faccio questo:
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
errori shelve.open("database")['whatever']
fuori con questo messaggio di errore:
AttributeError: 'module' object has no attribute 'Site'
Io sono completamente sconcertato, e le PYTHONDOCS, stranamente, non hanno molte informazioni sia. Tutto quello che dicono è che la chiave in un ripiano deve essere una stringa, ma il valore o dati possono essere "un oggetto arbitrario"
Soluzione
Sembra che tu refactoring il codice dopo aver salvato gli oggetti nel ripiano. Quando si recuperano gli oggetti dal ripiano, Python ricostruisce l'oggetto, e ha bisogno di trovare la classe originale che, presumibilmente, si è spostato. Questo problema è tipico quando si lavora con pickle
(come il modulo shelve
fa).
La soluzione, come suggerisce pduel, è di fornire un riferimento retrocompatibilità alla classe nella stessa posizione che è usato per essere, in modo che pickle
può trovare. Se si ri-salvare tutti gli oggetti, ricostruendo in tal modo i sottaceti, è possibile rimuovere che referece all'indietro-comatibility.
Altri suggerimenti
Sembra che Python è alla ricerca di un costruttore per un oggetto 'Site', e non trovandolo. Non ho usato accantonare, ma ricordo le regole per ciò che può essere in salamoia sono bizantina, e il sospetto che le regole Shelve sono simili.
Prova ad aggiungere la riga:
Sito = sitemodule.Site
(con il nome del modulo che fornisce 'Site') prima di provare unshelving. Questo assicura che una classe del sito si possono trovare.