2

我试图在 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
4

0 回答 0