Django:缓存包含lambda函数的字典

时间:2015-04-29 17:57:58

标签: python django django-cache

我正在尝试在django.core.cache中保存包含lambda函数的字典。以下示例无声地失败。

from django.core.cache import cache
cache.set("lambda", {"name": "lambda function", "function":lambda x: x+1})

cache.get("lambda")
#None

我正在寻找这种行为的解释。此外,我想知道是否存在不使用def的解决方法。

1 个答案:

答案 0 :(得分:1)

  

以下示例无声地失败。

不,它没有。 cache.set()调用应该会出现如下错误:

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

为什么呢?在内部,Django正在使用Python的pickle库来序列化您尝试存储在缓存中的值。当您想通过cache.get()调用再次将其从缓存中拉出时,Django需要确切知道如何重建缓存值。由于这种不希望丢失信息或不正确/不正确地重建缓存值的愿望,有几种restrictions可以腌制什么类型的对象。您会注意到这些类型的功能可能被腌制:

  • 在模块顶层定义的函数
  • 在模块顶层定义的内置函数

还有关于酸洗功能如何运作的进一步解释:

  

请注意,函数(内置和用户定义)由“完全限定”的名称引用而非值引用。这意味着只有函数名称被腌制,以及定义函数的模块的名称。函数的代码或其任何函数属性都不会被pickle。因此,定义模块必须可以在unpickling环境中导入,并且模块必须包含命名对象,否则将引发异常。