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"

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top