What is the best way to write a __getstate__ method that pickles almost all of an object’s attributes, but excludes a few?
I have an object with many properties, including one that references an instancemethod. instancemethod’s are not pickleable, so I’m getting an error when I try to pickle this object:
class Foo(object):
def __init__(self):
self.a = 'spam'
self.b = 'eggs'
self.c = 42
self.fn = self.my_func
def my_func(self):
print 'My hovercraft is full of eels'
import pickle
pickle.dumps(Foo()) # throws a "can't pickle instancemethod objects" TypeError
This __getstate__ method fixes this, but then I have to manually include all the properties I want to serialize:
def __getstate__(self):
return { 'a': self.a, 'b': self.b, 'c': self.c }
That’s not very scalable or maintainable if I have an object with many attributes or that changes frequently.
The only alternative I can think of is some kind of helper function that iterates through an object’s properties and adds them (or not) to the dictionary, based on the type.
Yeah, I think that’s pretty much what you’re left with, if you want enough "magic" to allow yourself to be lazy (and/or allow for dynamically added attributes). Keep in mind that "
picklecan’t handle this" isn’t the only reason you might not want to include something in the pickled state.But it’s not as hard as you seem to think, assuming you have code for the "should I pickle this?" logic: