Python: pickle 嵌套函数

标签 python function nested pickle

使用示例

def foo(a):
    def bar(b):
        return a+b
    return bar

d = {1:foo(1), 2:foo(2)}

pickle 模块似乎无法使用未在模块范围内定义的函数,因此 pickling 'd' 将不起作用。我应该考虑另一种 pickle 机制吗?

最佳答案

恐怕你不能 pickle 嵌套函数。

pickle 模块按名称序列化函数。也就是说,如果您在模块 mymodule 中有一个函数 myfunc,它只会保存名称 mymodule.myfunc 并在反序列化时再次查找它。 (这是一个重要的安全性和兼容性问题,因为它保证反序列化代码使用它自己的函数定义,而不是可能被破坏或过时的原始定义。)

唉,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 实例时,您需要有相同的类定义可用。

关于Python: pickle 嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019961/

相关文章:

python - 层数计数算法

python - 在 python-2.6 : how to do it and why they didn't do it 中从 float 转换为十进制

bash - 从 while read 行运行函数

javascript - 通过嵌套类将 CSS 样式表限定在一个 DIV 中

python - 将字符串放入列表理解中的列表中

c++ - 在循环条件中使用宏

在 C 中调用函数不产生函数

r - 如何在嵌套列表中使用 for 循环?

c# - N2 内容管理系统 : Are nested collections of ContentItems possible?

python - 函数 font_back - 错误