Wie kann ich Schaumergebnisse einlegen?

8

Um den wiederholten Zugriff auf einen SOAP-Server während der Entwicklung zu vermeiden, versuche ich, die Ergebnisse zwischenzuspeichern, damit ich den Rest meines Codes ausführen kann, ohne den Server jedes Mal abzufragen.

Mit dem unten stehenden Code erhalte ich PicklingError: Can't pickle <class suds.sudsobject.AdvertiserSearchResponse at 0x03424060>: it's not found as suds.sudsobject.AdvertiserSearchResponse , wenn ich versuche, ein Schaumergebnis zu pikken. Ich denke, das liegt daran, dass die Klassen dynamisch erstellt werden.

%Vor%

Wenn ich die -1 -Protokollversion von pickle.dump(result, file, -1) ablege, erhalte ich einen anderen Fehler:

%Vor%

Ist das Beizen das Richtige? Kann ich es zum Laufen bringen? Gibt es einen besseren Weg?

    
Mat 30.01.2010, 12:46
quelle

2 Antworten

8

Da die Fehlermeldung, die Sie gerade erhalten, Ihnen zu sagen versucht, versuchen Sie Instanzen, die nicht pickbar sind (im alten Beizpicker-Protokoll, das Sie jetzt verwenden), weil Ihre Klasse definiert __slots__ , aber keine __getstate__ Methode.

Aber selbst das Ändern ihrer Klasse würde nicht helfen, denn dann würden Sie auf das andere Problem stoßen - das Sie bereits korrekt als wahrscheinlich aufgrund dynamisch generierter Klassen identifiziert haben. Alle pickle protocols serialisieren Klassen (und Funktionen) "nach Namen" und beschränken sie im Wesentlichen auf die Namen der obersten Ebene in ihren Modulen. Und das Serialisieren einer Instanz absolut erfordert das Serialisieren der Klasse (wie sonst könnten Sie die Instanz später rekonstruieren, wenn die Klasse nicht in der Nähe wäre?!).

Sie müssen also Ihre Daten auf eine andere Weise speichern und neu laden, indem Sie Ihre aktuelle direkte Abhängigkeit von konkreten Klassen in suds.sudsobject zugunsten einer Schnittstelle (entweder formalisiert oder nur durch Duck-Typisierung definiert) aufheben Sie werden sowohl von solchen konkreten Klassen implementiert, wenn Sie tatsächlich auf den SOAP-Server zugreifen, als auch von einfacheren "hausgemachten", wenn Sie die Daten aus einer Datei laden. (Die Daten, die den Instanzstatus darstellen, können zweifelsohne als Diktat dargestellt werden. Sie können ihn also zwangsweise erzwingen, z. B. über das Modul copy_reg , mit dem Sie Serialisierungs- / Deserialisierungsprotokolle für erzwungene Objekte anpassen können nicht-invasiv behandeln [[also können Sie nicht herumgehen, indem Sie __getstate__ oder ähnliches zu ihren Klassen hinzufügen]] - das Problem wird nur auftreten, wenn es ein reichhaltiges Netz gegenseitiger Referenzen unter solchen Objekten gibt.

    
Alex Martelli 30.01.2010, 17:45
quelle
2

Sie picken das Klassenobjekt selbst und nicht Instanzobjekte der Klasse. Dies funktioniert nicht, wenn das Klassenobjekt neu erstellt wird. Das Beibehalten von Instanzen der Klasse funktioniert jedoch so lange, wie das Klassenobjekt vorhanden ist.

    
Håvard S 30.01.2010 13:11
quelle

Tags und Links