views:

67

answers:

2

I would like to avoid pickling of certain fields in an instance of a class. Currently, before pickling I just set those fields to None, but I wonder whether there's more elegant solution?

+1  A: 

There is an example here which solves your problem with __getstate__ and __setstate__.

unutbu
Fastest Fingers First :P
anijhaw
+4  A: 

One way to handle instance attributes that are not picklable objects is to use the special methods available for modifying a class instance's state: getstate() and setstate(). Here is an example

class Foo(object):

def __init__(self, value, filename):
    self.value = value
    self.logfile = file(filename, 'w')

def __getstate__(self):
    """Return state values to be pickled."""
    f = self.logfile
    return (self.value, f.name, f.tell())

def __setstate__(self, state):
    """Restore state from the unpickled state values."""
    self.value, name, position = state
    f = file(name, 'w')
    f.seek(position)
    self.logfile = f

When an instance of Foo is pickled, Python will pickle only the values returned to it when it calls the instance's getstate() method. Likewise, during unpickling, Python will supply the unpickled values as an argument to the instance's setstate() method. Inside the setstate() method we are able to recreate the file object based on the name and position information we pickled, and assign the file object to the instance's logfile attribute.

Reference: http://www.ibm.com/developerworks/library/l-pypers.html

anijhaw