Source code for lagom.utils.serialize

from pathlib import Path

import pickle
import cloudpickle

import yaml


[docs]def pickle_load(f): r"""Read a pickled data from a file. Args: f (str/Path): file path """ if isinstance(f, Path): f = f.as_posix() with open(f, 'rb') as file: return cloudpickle.load(file)
[docs]def pickle_dump(obj, f, ext='.pkl'): r"""Serialize an object using pickling and save in a file. .. note:: It uses cloudpickle instead of pickle to support lambda function and multiprocessing. By default, the highest protocol is used. .. note:: Except for pure array object, it is not recommended to use ``np.save`` because it is often much slower. Args: obj (object): a serializable object f (str/Path): file path ext (str, optional): file extension. Default: .pkl """ if isinstance(f, Path): f = f.as_posix() with open(f+ext, 'wb') as file: return cloudpickle.dump(obj=obj, file=file, protocol=pickle.HIGHEST_PROTOCOL)
[docs]def yaml_load(f): r"""Read the data from a YAML file. Args: f (str/Path): file path """ if isinstance(f, Path): f = f.as_posix() with open(f, 'r') as file: return yaml.load(file, Loader=yaml.FullLoader)
[docs]def yaml_dump(obj, f, ext='.yml'): r"""Serialize a Python object using YAML and save in a file. .. note:: YAML is recommended to use for a small dictionary and it is super human-readable. e.g. configuration settings. For saving experiment metrics, it is better to use :func:`pickle_dump`. .. note:: Except for pure array object, it is not recommended to use ``np.load`` because it is often much slower. Args: obj (object): a serializable object f (str/Path): file path ext (str, optional): file extension. Default: .yml """ if isinstance(f, Path): f = f.as_posix() with open(f+ext, 'w') as file: return yaml.dump(obj, file, sort_keys=False)
[docs]class CloudpickleWrapper(object): r"""Uses cloudpickle to serialize contents (multiprocessing uses pickle by default) This is useful when passing lambda definition through Process arguments. """ def __init__(self, x): self.x = x def __call__(self, *args, **kwargs): return self.x(*args, **kwargs) def __getattr__(self, name): return getattr(self.x, name) def __getstate__(self): import cloudpickle return cloudpickle.dumps(self.x) def __setstate__(self, ob): import pickle self.x = pickle.loads(ob)