Python serialize lexical closures?

后端 未结 5 1015
遇见更好的自我
遇见更好的自我 2020-12-14 18:24

Is there a way to serialize a lexical closure in Python using the standard library? pickle and marshal appear not to work with lexical closures. I don\'t really care about

5条回答
  •  忘掉有多难
    2020-12-14 19:03

    #!python
    
    import marshal, pickle, new
    
    def dump_func(f):
        if f.func_closure:
            closure = tuple(c.cell_contents for c in f.func_closure)
        else:
            closure = None
        return marshal.dumps(f.func_code), f.func_defaults, closure
    
    
    def load_func(code, defaults, closure, globs):
        if closure is not None:
            closure = reconstruct_closure(closure)
        code = marshal.loads(code)
        return new.function(code, globs, code.co_name, defaults, closure)
    
    
    def reconstruct_closure(values):
        ns = range(len(values))
        src = ["def f(arg):"]
        src += [" _%d = arg[%d]" % (n, n) for n in ns]
        src += [" return lambda:(%s)" % ','.join("_%d"%n for n in ns), '']
        src = '\n'.join(src)
        try:
            exec src
        except:
            raise SyntaxError(src)
        return f(values).func_closure
    
    
    
    
    if __name__ == '__main__':
    
        def get_closure(x):
            def the_closure(a, b=1):
                return a * x + b, some_global
            return the_closure
    
        f = get_closure(10)
        code, defaults, closure = dump_func(f)
        dump = pickle.dumps((code, defaults, closure))
        code, defaults, closure = pickle.loads(dump)
        f = load_func(code, defaults, closure, globals())
    
        some_global = 'some global'
    
        print f(2)
    

提交回复
热议问题