can't pickle instancemethod objects

J

Jim Lewis

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?
 
S

Steven D'Aprano

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.
 
J

Jim Lewis

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
 
S

Steven D'Aprano

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.
 
J

Jim Lewis

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.
 
S

Steven D'Aprano

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.
 
J

Jim Lewis

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 :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top