我试图在 django 1.11 中腌制一个 django 模型对象,它抛出一个错误 - “TypeError:无法腌制函数对象”
我正在使用cPickle.dumps(obj)
我知道我们不能腌制函数对象。
但是,当我尝试在 django 1.3 环境中进行腌制时,同样的对象做得很好。因此,为了检查这一点,我进入了copy_reg.py -> _reduce_ex函数,这里self作为函数 my_func_name在 django 1.11 中的 0x7fe5075e6f50 和django.db.models.base.ModelState 对象在 django 1.3 中的 0x7fdda59765d0 出现。
因此,在 django 1.3 中 ModelState 可以腌制,但在 django 1.11 中不能腌制,因为它是函数对象。
为什么 self 在 1.11 中作为函数出现而在 1.3 中作为 ModelState 类出现。
以下是 copy_reg.py 中的函数——
def _reduce_ex(self, proto):
assert proto < 2
for base in self.__class__.__mro__:
if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
break
else:
base = object # not really reachable
if base is object:
state = None
else:
if base is self.__class__:
raise TypeError, "can't pickle %s objects" % base.__name__
state = base(self)
args = (self.__class__, base, state)
try:
getstate = self.__getstate__
except AttributeError:
if getattr(self, "__slots__", None):
raise TypeError("a class that defines __slots__ without "
"defining __getstate__ cannot be pickled")
try:
dict = self.__dict__
except AttributeError:
dict = None
else:
dict = getstate()
if dict:
return _reconstructor, args, dict
else:
return _reconstructor, args