类所在位置:gym\utils\ezpickle.py
为什么要设计 EzPickle?
1. pickle 是实现 Python 对象序列化的库
2. 但是有一些对象无法被序列化,如:数据库连接,打开的网络套接字,正在运行的线程等。
3. 如何选择想要序列化的范围?
4. 通过双下方法(dunder method)中的 __getstate__ 方法。如果不重写__getstate__(),则会使用默认实例的__dict__。
5. EzPickle 中重写了__getstate__()和__setstate__(),通过构造器参数(*args,**kwargs)实现序列化和反序列化强化学习的环境。
class EzPickle:
"""Objects that are pickled and unpickled via their constructor arguments."""
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__)
如何使用 ExPickle?
以CarRacing为例,继承gym.Env 与 EzPickle。
class CarRacing(gym.Env, EzPickle):