Spaces:
Running
Running
"""Class for pickling and unpickling objects via their constructor arguments.""" | |
class EzPickle: | |
"""Objects that are pickled and unpickled via their constructor arguments. | |
Example:: | |
>>> class Dog(Animal, EzPickle): | |
... def __init__(self, furcolor, tailkind="bushy"): | |
... Animal.__init__() | |
... EzPickle.__init__(furcolor, tailkind) | |
When this object is unpickled, a new ``Dog`` will be constructed by passing the provided furcolor and tailkind into the constructor. | |
However, philosophers are still not sure whether it is still the same dog. | |
This is generally needed only for environments which wrap C/C++ code, such as MuJoCo and Atari. | |
""" | |
def __init__(self, *args, **kwargs): | |
"""Uses the ``args`` and ``kwargs`` from the object's constructor for pickling.""" | |
self._ezpickle_args = args | |
self._ezpickle_kwargs = kwargs | |
def __getstate__(self): | |
"""Returns the object pickle state with args and kwargs.""" | |
return { | |
"_ezpickle_args": self._ezpickle_args, | |
"_ezpickle_kwargs": self._ezpickle_kwargs, | |
} | |
def __setstate__(self, d): | |
"""Sets the object pickle state using d.""" | |
out = type(self)(*d["_ezpickle_args"], **d["_ezpickle_kwargs"]) | |
self.__dict__.update(out.__dict__) | |