有没有一种使用标准库在Python中序列化词法闭包的方法?pickle和marshal似乎不适用于词汇闭包。我并不真正在乎二进制与字符串序列化等细节,它只需要工作即可。例如:
def foo(bar, baz) : def closure(waldo) : return baz * waldo return closure
我只想将Closure实例转储到文件中并读回。
编辑:可以解决此问题的一个相对明显的方法是使用一些反射技巧将词汇闭包转换为类对象,反之亦然。然后可以将其转换为类,进行序列化,反序列化,再转换回闭包。哎呀,考虑到Python是鸭子类型的,如果您重载该类的函数调用运算符以使其看起来像一个函数,那么您甚至根本不需要将其转换回闭包,并且使用它的代码也不知道区别。如果那里有Python反射API专家,请说出来。
如果您仅使用带有__call__方法的类作为开始,则所有类都应与一起顺利使用pickle。
__call__
pickle
class foo(object): def __init__(self, bar, baz): self.baz = baz def __call__(self,waldo): return self.baz * waldo
另一方面,由于pickle处理类和实例的方式,将闭包转换为在运行时创建的新类的实例的黑客将不起作用。 pickle不存储类;仅模块名称和类名称。当读回实例或类时,它将尝试导入模块并在其中找到所需的类。如果您使用的是即时创建的课程,那么您会很不幸。