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 bekommen

Also, 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“

sein
War es hilfreich?

Lö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.

Versuchen

Hinzufü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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top