Spaces:
Running
on
L40S
Running
on
L40S
# Copyright (c) Facebook, Inc. and its affiliates. | |
import cloudpickle | |
class PicklableWrapper: | |
""" | |
Wrap an object to make it more picklable, note that it uses | |
heavy weight serialization libraries that are slower than pickle. | |
It's best to use it only on closures (which are usually not picklable). | |
This is a simplified version of | |
https://github.com/joblib/joblib/blob/master/joblib/externals/loky/cloudpickle_wrapper.py | |
""" | |
def __init__(self, obj): | |
while isinstance(obj, PicklableWrapper): | |
# Wrapping an object twice is no-op | |
obj = obj._obj | |
self._obj = obj | |
def __reduce__(self): | |
s = cloudpickle.dumps(self._obj) | |
return cloudpickle.loads, (s,) | |
def __call__(self, *args, **kwargs): | |
return self._obj(*args, **kwargs) | |
def __getattr__(self, attr): | |
# Ensure that the wrapped object can be used seamlessly as the previous object. | |
if attr not in ["_obj"]: | |
return getattr(self._obj, attr) | |
return getattr(self, attr) | |