恐怕您不能腌制嵌套函数。
该pickle
模块按名称序列化功能。也就是说,如果您myfunc
在模块中有一个函数,mymodule
它只会保存名称,mymodule.myfunc
并在反序列化时再次查找它。(这是一个重要的安全性和兼容性问题,因为它保证了反序列化的代码对函数使用自己的定义,而不是可能被破坏或作废的原始定义。)
las,pickle
嵌套函数无法做到这一点,因为无法直接通过名称来寻址它们。bar
例如,无法从外部访问您的函数foo
。
如果需要像函数一样工作的可序列化对象,则可以使用__call__
方法来创建类:
class foo(object):
def __init__(self, a):
self.a = a
def __call__(self, b): # the function formerly kNown as "bar"
return self.a + b
这就像问题中的嵌套函数一样工作,应该不会对问题造成影响pickle
。但是请注意,在反序列化foo
实例时,需要具有相同的类定义。