Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell for which object attribute pickle fails?

When you pickle an object that has some attributes which cannot be pickled it will fail with a generic error message like:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

Is there any way to tell which attribute caused the exception? I am using Python 2.5.2.

Even though I understand in principle the root cause of the problem (e.g. in the above example having an instance method) it can still be very hard to exactly pinpoint it. In my case I already defined a custom __getstate__ method, but forgot about a critical attribute. This happened in a complicated structure of nested objects, so it took me a while to identify the bad attribute.

As requested, here is one simple example were pickle intentionally fails:

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) 

This is the output:

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 

Unfortunately there is no hint that the attribute test_meth causes the problem.

like image 366
nikow Avatar asked Feb 20 '09 14:02

nikow


People also ask

What objects Cannot be pickled in Python?

Generally you can pickle any object if you can pickle every attribute of that object. Classes, functions, and methods cannot be pickled -- if you pickle an object, the object's class is not pickled, just a string that identifies what class it belongs to.

Which function returns the pickled representation of the object?

The pickle module also consists of dumps() function that returns a string representation of pickled data.

Is pickling used for object Deserialization?

Pickle in Python is primarily used in serializing and deserializing a Python object structure. In other words, it's the process of converting a Python object into a byte stream to store it in a file/database, maintain program state across sessions, or transport data over the network.

Which method is used to read a pickle a file?

load() – This function is used to read a pickled object representation from the open file object file and return the reconstituted object hierarchy specified.


1 Answers

You could file a bug against Python for not including more helpful error messages. In the meantime, modify the _reduce_ex() function in copy_reg.py.

if base is self.__class__:     print self # new        raise TypeError, "can't pickle %s objects" % base.__name__ 

Output:

<bound method ?.test_func of <__main__.Test object at 0xb7f4230c>> Traceback (most recent call last):   File "nopickle.py", line 14, in ?     pickle.dumps(test)   File "/usr/lib/python2.4/copy_reg.py", line 69, in _reduce_ex     raise TypeError, "can't pickle %s objects" % base.__name__ TypeError: can't pickle instancemethod objects 
like image 114
joeforker Avatar answered Sep 22 '22 17:09

joeforker