Frage
Ich versuche, einige Websites zu setzen i in ein Regal gekrochen, aber das Regal wird jede Website-Objekte nicht akzeptieren. Es wird akzeptiert Listen, Strings, Tupel, was Sie haben, aber sobald ich in einem Standort-Objekt gesetzt, stürzt es, wenn ich versuche, den Inhalt des shelve
zu bekommenAlso, wenn ich meine shelve wie folgt füllen:
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']
funktioniert perfekt.
Aber wenn ich dies tun:
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']
Fehler heraus mit dieser Fehlermeldung:
AttributeError: 'module' object has no attribute 'Site'
bin ich völlig ratlos, und die pythondocs, seltsam, haben entweder nicht viel Info. sie sagen, ist alles, was der Schlüssel in einem Regal ein String sein muss, aber der Wert oder Daten „ein beliebiges Objekt“
seinLösung
Es sieht aus wie Sie Ihren Code Refactoring nach Objekten im Regal zu speichern. Wenn Objekte aus dem Regal Abrufen neu erstellt Python das Objekt, und es muss die Original-Klasse finden, die vermutlich Sie bewegt haben. Dieses Problem ist typisch, wenn sie mit pickle
(wie das shelve
Modul der Fall ist) zu arbeiten.
Die Lösung, wie pduel schon sagt, ist eine Rückwärtskompatibilität Verweis auf die Klasse an der gleichen Stelle zu erbringen, dass sie verwendet werden, so dass pickle
es finden kann. Wenn Sie erneut Speichern Sie alle Objekte, wodurch die Gurken Wiederaufbau, können Sie diese rückwärts comatibility referece entfernen.
Andere Tipps
Es scheint, dass Python sucht einen Konstruktor für ein Objekt ‚Standorts‘, und findet es nicht. Ich habe nicht shelve verwendet, aber ich erinnere mich, die Regeln für das, was byzantinisch gebeizt werden können, sind und vermuten, dass die shelve Regeln ähnlich sind.
VersuchenHinzufügen der Zeile:
Site = sitemodule.Site
(mit dem Namen des Moduls Bereitstellung von ‚Standort‘), bevor Sie unshelving versuchen. Dadurch wird sichergestellt, dass eine Klasse Standort gefunden werden kann.