Wie erkennt man, für welches Objekt-Attribut-Pickle ein Fehler auftritt?
Wenn Sie Gurke ein Objekt hat Attribute, die nicht gebeizt wird es nicht mit einer generischen Fehlermeldung wie:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Gibt es eine Möglichkeit zu sagen, welche attribute die die Ausnahme verursacht hat? Ich bin mit Python-2.5.2.
Obwohl ich verstehe im Prinzip die Ursache des Problems (z.B. im obigen Beispiel mit einer Instanz-Methode) kann es immer noch sehr schwer zu genau sagen. In meinem Fall habe ich bereits definiert eine benutzerdefinierte __getstate__
Methode, aber vergessen, über ein kritisches Attribut. Dies geschah in einem komplizierten Struktur von verschachtelten Objekten, so dauerte es eine Weile, um zu identifizieren, die schlecht Attribut.
Wie gewünscht, hier ist ein einfaches Beispiel, waren Gurke absichtlich nicht:
import cPickle as pickle
import new
class Test(object):
pass
def test_func(self):
pass
test = Test()
pickle.dumps(test)
print "now with instancemethod..."
test.test_meth = new.instancemethod(test_func, test)
pickle.dumps(test)
Dies ist die Ausgabe:
now with instancemethod...
Traceback (most recent call last):
File "/home/wilbert/develop/workspace/Playground/src/misc/picklefail.py", line 15, in <module>
pickle.dumps(test)
File "/home/wilbert/lib/python2.5/copy_reg.py", line 69, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle instancemethod objects
Leider gibt es keinen Hinweis, dass das Attribut test_meth
das problem verursacht.
InformationsquelleAutor der Frage nikow | 2009-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man einen Fehler gegen Python für nicht einschließlich hilfreiche Fehlermeldungen. In der Zwischenzeit, ändern Sie die
_reduce_ex()
Funktion incopy_reg.py
.Ausgabe:
InformationsquelleAutor der Antwort joeforker
Ich hatte das gleiche problem wie du, aber meine Klassen waren ein bisschen komplizierter (d.h. einem großen Baum, der ähnliche Gegenstände), damit der Druck nicht viel helfen, so dass ich gehackt zusammen eine Hilfsfunktion. Es ist nicht vollständig und dient nur zur Verwendung mit Beizen Protokoll 2:
Es war genug, so konnte ich suchen so meine Probleme. Wenn Sie möchten, um es zu erweitern, um alles abzudecken, das Protokoll ist beschrieben in http://www.python.org/dev/peps/pep-0307/ ich habe diesen Beitrag editierbar, so kann jeder den code aktualisieren.
Ein Beispiel der Nutzung, wo K das Objekt, die nicht Gurke
Dies bedeutet, dass die Standardtitel K. _gen ist nicht picklable und das gleiche gilt für K. _base._gens.
InformationsquelleAutor der Antwort
Habe ich festgestellt, dass, wenn Sie eine Unterklasse Pickler und wickeln Sie die Pickler.save () - Methode in einen try, except block
Dann nennen Sie es wie so
InformationsquelleAutor der Antwort Stuart Mitchell
Wenn Sie
dill
dein Beispiel fehl nicht zu pickle...Also müssen wir etwas finden, das
dill
können nicht Gurke...Wenn die Fehlermeldung nicht gut war, könnte ich
dill.detect
um zu sehen, welche was unpicklable Objekte der top-level-Objekt enthält.dill
sich nicht auf die__getstate__
Methode vorhanden ist, obwohl vielleicht sollte es nutzen, wenn es vorhanden ist. Sie können auchobjgraph
sich ein Bild von allen Objekt-Abhängigkeiten, die verwendet wird, um die Sache, nicht Gurke. Es kann Ihnen helfen, Sortieren Sie, was die Wurzel des Problems ist, auf der Grundlage der oben genannten Informationen.Sehen
dill.detect
Verwendung im aufspüren von unpicklable Artikel in dieser Ausgabe: https://github.com/uqfoundation/dill/issues/58InformationsquelleAutor der Antwort Mike McKerns