2015-04-29 2 views
1

Я пытаюсь сохранить словарь, содержащий функцию лямбда в django.core.cache. Нижеприведенный пример терпит неудачу.Django: кешировать словарь, содержащий функцию лямбда

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

cache.get("lambda") 
#None 

Я ищу объяснения этого поведения. Кроме того, я хотел бы знать, есть ли обходное решение без использования def.

ответ

1

Приведенный ниже пример терпит неудачу.

Нет, это не так. cache.set() вызов должен дать вам ошибку, как:

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

Почему? Внутри Django использует библиотеку pickle Python для сериализации значения, которое вы пытаетесь сохранить в кеше. Если вы хотите снова вытащить его из кеша с помощью своего вызова cache.get(), Django должен точно знать, как восстановить кешированное значение. И из-за этого желания не потерять информацию или неправильно/ненадлежащим образом восстановить кешированную стоимость, существует несколько restrictions о том, какие виды объектов можно мариновать. Вы заметите, что только эти типы функций могут быть маринованные:

  • функции, определенные на верхнем уровне модуля
  • встроенные функции, определенные на верхнем уровне модуля

И это дальнейшее объяснение о том, как функционирует травильных работ:

Обратите внимание, что функции (встроенные и определяемые пользователем) замачиваются с помощью «полной квалификации», а не по значению. Это означает, что только имя функции маринуется вместе с именем модуля, в котором функция определена. Ни код функции, ни какой-либо из ее функциональных атрибутов не маринован. Таким образом, определяющий модуль должен быть импортируемым в среде раскалывания, а модуль должен содержать именованный объект, иначе будет создано исключение.