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

Schreibe einen Kommentar