You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.6 KiB
74 lines
1.6 KiB
import six
|
|
import types
|
|
|
|
|
|
class Serializer(object):
|
|
FORMATS = {
|
|
'json',
|
|
'yaml',
|
|
'pickle',
|
|
}
|
|
|
|
@classmethod
|
|
def check_format(cls, fmt):
|
|
if fmt not in cls.FORMATS:
|
|
raise Exception('Unsupported serialization format: {}'.format(fmt))
|
|
|
|
@staticmethod
|
|
def json():
|
|
from json import loads, dumps
|
|
return (loads, dumps)
|
|
|
|
@staticmethod
|
|
def yaml():
|
|
from yaml import load, dump
|
|
return (load, dump)
|
|
|
|
@staticmethod
|
|
def pickle():
|
|
from pickle import loads, dumps
|
|
return (loads, dumps)
|
|
|
|
@classmethod
|
|
def loads(cls, fmt, raw):
|
|
loads, _ = getattr(cls, fmt)()
|
|
return loads(raw)
|
|
|
|
@classmethod
|
|
def dumps(cls, fmt, raw):
|
|
_, dumps = getattr(cls, fmt)()
|
|
return dumps(raw)
|
|
|
|
|
|
def dump_cell(cell):
|
|
return cell.cell_contents
|
|
|
|
|
|
def load_cell(cell):
|
|
if six.PY3:
|
|
return (lambda y: cell).__closure__[0]
|
|
else:
|
|
return (lambda y: cell).func_closure[0]
|
|
|
|
|
|
def dump_function(func):
|
|
if six.PY3:
|
|
return (
|
|
func.__code__,
|
|
func.__name__,
|
|
func.__defaults__,
|
|
list(map(dump_cell, func.__closure__)) if func.__closure__ else [],
|
|
)
|
|
else:
|
|
return (
|
|
func.func_code,
|
|
func.func_name,
|
|
func.func_defaults,
|
|
list(map(dump_cell, func.func_closure)) if func.func_closure else [],
|
|
)
|
|
|
|
|
|
def load_function(args):
|
|
code, name, defaults, closure = args
|
|
closure = tuple(map(load_cell, closure))
|
|
return types.FunctionType(code, globals(), name, defaults, closure)
|
|
|