def _deserialize_function_sandbox(sandbox):
'''
environment : dictionary
create by `serialize_sandbox`
'''
import marshal
import importlib
environment = {}
defined_function = []
main_func = None
# first pass we deserialize all type except function type
for name, (typ, val) in sandbox.items():
if isinstance(typ, string_types):
if typ == 'None':
val = None
elif typ == 'edward_distribution':
try:
import edward
val = getattr(edward.models, val)
except ImportError:
raise ImportError("Cannot import 'edward' library to deserialize "
"the function.")
# exec("from edward.models import %s as %s" % (val, name))
elif typ == 'function_type':
val = types.FunctionType
elif typ == 'Mapping':
val = cPickle.loads(val)
elif typ == 'ndarray':
val = np.fromstring(val[0], dtype=val[1])
elif typ == 'module':
val = importlib.import_module(val)
elif 'imported_function' == typ:
val = getattr(importlib.import_module(val[1]), val[0])
if '_main' in typ: main_func = val
elif 'defined_function' in typ:
val = str_to_func(val, globals())
if '_main' in typ: main_func = val
defined_function.append(name)
elif builtins.any(isinstance(typ, i) for i in _primitives):
pass
else:
raise ValueError('Unsupport deserializing type: {}, '
'value: {}'.format(typ, val))
environment[name] = val
# ====== create all defined function ====== #
# second pass, function all funciton and set it globales to new environment
for name in defined_function:
func = environment[name]
func.__globals__.update(environment)
return main_func, environment
评论列表
文章目录