我正在尝试在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
的解决方法。
答案 0 :(得分:1)
以下示例无声地失败。
不,它没有。 cache.set()
调用应该会出现如下错误:
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
为什么呢?在内部,Django正在使用Python的pickle库来序列化您尝试存储在缓存中的值。当您想通过cache.get()
调用再次将其从缓存中拉出时,Django需要确切知道如何重建缓存值。由于这种不希望丢失信息或不正确/不正确地重建缓存值的愿望,有几种restrictions可以腌制什么类型的对象。您会注意到仅这些类型的功能可能被腌制:
还有关于酸洗功能如何运作的进一步解释:
请注意,函数(内置和用户定义)由“完全限定”的名称引用而非值引用。这意味着只有函数名称被腌制,以及定义函数的模块的名称。函数的代码或其任何函数属性都不会被pickle。因此,定义模块必须可以在unpickling环境中导入,并且模块必须包含命名对象,否则将引发异常。