Pickling Python New Style Object Using State
Posted by sky | Tags: Python
Pickling is basically Python object serialization. See the Python PEP 307 Extensions to the pickle protocol for further details. Below, I show a simple way to pickle a new-style object using the state of the object. obj.__setstate__(state) will be called when unpickling if the state is being pickled.The new protocol 2 pickles are much smaller than classic pickles. (due to the __newobj__ unpickling function - new opcode )def __newobj__(cls, *args): return cls.__new__(cls, *args) # NEWOBJ pickle class AClass(object): .. def __reduce__(self): return (__newobj__, (self.__class__,), self.__getstate__()) def __getstate__(self): state = .. # object's data return state def __setstate__(self, st): # restore object's data
Previous Post Next PostWhen the unpickling function returned by __reduce__ (the first item of the returned tuple) has the name __newobj__, something special happens for pickle protocol 2. An unpickling function named __newobj__ is assumed to have the following semantics: def __newobj__(cls, *args): return cls.__new__(cls, *args) Pickle protocol 2 special-cases an unpickling function with this name, and emits a pickling opcode that, given 'cls' and 'args', will return cls.__new__(cls, *args) without also pickling a reference to __newobj__ (this is the same pickling opcode used by protocol 2 for a new-style class instance when no __reduce__ implementation exists). This is the main reason why protocol 2 pickles are much smaller than classic pickles.