Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > can't pickle instancemethod objects

Reply
Thread Tools

can't pickle instancemethod objects

 
 
Jim Lewis
Guest
Posts: n/a
 
      07-09-2006
Pickling an instance of a class, gives "can't pickle instancemethod
objects". What does this mean? How do I find the class method creating
the problem?

 
Reply With Quote
 
 
 
 
Steven D'Aprano
Guest
Posts: n/a
 
      07-09-2006
On Sun, 09 Jul 2006 05:45:27 -0700, Jim Lewis wrote:

> Pickling an instance of a class, gives "can't pickle instancemethod
> objects". What does this mean?


It means you can't pickle instance methods.

> How do I find the class method creating the problem?


How about you post the complete stack trace of the exception? Chances are
it will contain much useful information.


--
Steven.

 
Reply With Quote
 
 
 
 
Jim Lewis
Guest
Posts: n/a
 
      07-09-2006
> How about you post the complete stack trace of the exception?

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\program files\python\lib\lib-tk\Tkinter.py", line 1345, in
__call__
return self.func(*args)
File "C:\Public\world.py", line 1832, in BtnGo
DoBtnGo()
File "C:\Public\world.py", line 1812, in DoBtnGo
if DoPickle: SavePickle ()
File "C:\Public\world.py", line 1817, in SavePickle
pickle.dump (pop,f)
File "C:\program files\python\lib\pickle.py", line 1382, in dump
Pickler(file, protocol, bin).dump(obj)
File "C:\program files\python\lib\pickle.py", line 231, in dump
self.save(obj)
File "C:\program files\python\lib\pickle.py", line 293, in save
f(self, obj) # Call unbound method with explicit self
File "C:\program files\python\lib\pickle.py", line 739, in save_inst
save(stuff)
File "C:\program files\python\lib\pickle.py", line 293, in save
f(self, obj) # Call unbound method with explicit self
File "C:\program files\python\lib\pickle.py", line 663, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\program files\python\lib\pickle.py", line 677, in
_batch_setitems
save(v)
File "C:\program files\python\lib\pickle.py", line 293, in save
f(self, obj) # Call unbound method with explicit self
File "C:\program files\python\lib\pickle.py", line 614, in save_list
self._batch_appends(iter(obj))
File "C:\program files\python\lib\pickle.py", line 629, in
_batch_appends
save(x)
File "C:\program files\python\lib\pickle.py", line 293, in save
f(self, obj) # Call unbound method with explicit self
File "C:\program files\python\lib\pickle.py", line 739, in save_inst
save(stuff)
File "C:\program files\python\lib\pickle.py", line 293, in save
f(self, obj) # Call unbound method with explicit self
File "C:\program files\python\lib\pickle.py", line 663, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\program files\python\lib\pickle.py", line 677, in
_batch_setitems
save(v)
File "C:\program files\python\lib\pickle.py", line 313, in save
rv = reduce(self.proto)
File "C:\program files\python\lib\copy_reg.py", line 69, in
_reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle instancemethod objects

 
Reply With Quote
 
Steven D'Aprano
Guest
Posts: n/a
 
      07-09-2006
On Sun, 09 Jul 2006 07:06:25 -0700, Jim Lewis wrote:

>> How about you post the complete stack trace of the exception?

>
> Exception in Tkinter callback
> Traceback (most recent call last):
> File "C:\program files\python\lib\lib-tk\Tkinter.py", line 1345, in
> __call__
> return self.func(*args)
> File "C:\Public\world.py", line 1832, in BtnGo
> DoBtnGo()
> File "C:\Public\world.py", line 1812, in DoBtnGo
> if DoPickle: SavePickle ()
> File "C:\Public\world.py", line 1817, in SavePickle
> pickle.dump (pop,f)


I'd suggest that "pop" could be your culprit. At least, that's where I'd
start looking. What is pop? A function or an instance method?

I can't reproduce your error exactly -- the closest I get is "TypeError:
can't pickle function objects" when I try to pickle a method. Possibly
that's just a change in error message, which is not guaranteed to be
constant across Python versions.

--
Steven.

 
Reply With Quote
 
Jim Lewis
Guest
Posts: n/a
 
      07-09-2006
> I'd suggest that "pop" could be your culprit. ...What is pop? A function or an instance method?

Neither. pop is an instance of a class, like:
class X:
...
pop = X ()

pop surely is the culprit but it has arrays of objects, etc., and I
don't know what to look for.

 
Reply With Quote
 
Steven D'Aprano
Guest
Posts: n/a
 
      07-09-2006
On Sun, 09 Jul 2006 08:39:29 -0700, Jim Lewis wrote:

>> I'd suggest that "pop" could be your culprit. ...What is pop? A function or an instance method?

>
> Neither. pop is an instance of a class, like:
> class X:
> ...
> pop = X ()
>
> pop surely is the culprit but it has arrays of objects, etc., and I
> don't know what to look for.


I'd start by looking for an attribute of pop that holds a reference to
some function or method. E.g. something like this:

class X():
def method(self):
pass
def __init__(self):
self.L = [1, "a", X.method] # note the lack of ()s

pop = X()

Otherwise, I'm working blind without knowing more about your class.

Here's a thought: comment out every attribute in your class, and then try
pickling it. If it succeeds, uncomment just *one* attribute, and try
pickling again. Repeat until pickling fails.


--
Steven.

 
Reply With Quote
 
Jim Lewis
Guest
Posts: n/a
 
      07-09-2006
> Here's a thought: comment out every attribute in your class, and then try
> pickling it. If it succeeds, uncomment just *one* attribute, and try
> pickling again. Repeat until pickling fails.


Was trying to avoid that but you motivated me to do so and now I found
the probem.

In a utility routine I had:
obj.act = act
ActionSucceded = obj.act()

Had to add:
obj.act = None

Thanks

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
pickle error: can't pickle instancemethod objects Michele Simionato Python 2 05-23-2008 08:29 AM
pickle and instancemethod objects Steven Bethard Python 2 09-13-2006 05:06 PM
a pickle's pickle temposs@gmail.com Python 4 08-02-2005 07:20 PM
'class' argument optional for new.instancemethod? Martin Miller Python 1 03-12-2005 01:31 AM
Why instancemethod when I can add functions to classes outside class body? Rim Python 7 07-28-2003 03:30 PM



Advertisments