Skip to content

Instantly share code, notes, and snippets.

@rh314
Last active November 27, 2017 19:29
Show Gist options
  • Save rh314/0fdb8341123ea0fea8443f5cde496858 to your computer and use it in GitHub Desktop.
Save rh314/0fdb8341123ea0fea8443f5cde496858 to your computer and use it in GitHub Desktop.
# Gist for discussion: https://github.com/fchollet/keras/pull/8592#discussion_r153287881
# OPTION 1 - replace list comprehension with for loop:
def func_load(code, defaults=None, closure=None, globs=None):
"""Deserializes a user defined function.
# Arguments
code: bytecode of the function.
defaults: defaults of the function.
closure: closure of the function.
globs: dictionary of global objects.
# Returns
A function object.
"""
if isinstance(code, (tuple, list)): # unpack previous dump
code, defaults, closure = code
if isinstance(defaults, list):
defaults = tuple(defaults)
if closure is not None:
closure = list(closure)
for k, closure_value in enumerate(closure):
closure[k] = ensure_value_to_cell(closure_value)
closure = tuple(closure)
raw_code = codecs.decode(code.encode('ascii'), 'base64')
code = marshal.loads(raw_code)
if globs is None:
globs = globals()
return python_types.FunctionType(code, globs,
name=code.co_name,
argdefs=defaults,
closure=closure)
# OPTION 2 - same as option 1, but also inlined ensure_value_to_cell:
def func_load(code, defaults=None, closure=None, globs=None):
"""Deserializes a user defined function.
# Arguments
code: bytecode of the function.
defaults: defaults of the function.
closure: closure of the function.
globs: dictionary of global objects.
# Returns
A function object.
"""
if isinstance(code, (tuple, list)): # unpack previous dump
code, defaults, closure = code
if isinstance(defaults, list):
defaults = tuple(defaults)
if closure is not None:
closure = list(closure)
for k, closure_value in enumerate(closure):
def dummy_fn():
closure_value # just access it so it gets captured in .__closure__
closure_value_as_cell = dummy_fn.__closure__[0]
if not isinstance(closure_value, type(closure_value_as_cell)):
closure[k] = closure_value_as_cell
closure = tuple(closure)
raw_code = codecs.decode(code.encode('ascii'), 'base64')
code = marshal.loads(raw_code)
if globs is None:
globs = globals()
return python_types.FunctionType(code, globs,
name=code.co_name,
argdefs=defaults,
closure=closure)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment