pickle错误:断言id(obj)不在self.memo中

0 投票
1 回答
1016 浏览
提问于 2025-04-18 16:49

我现在正在使用 dill(这是一个比pickle更高级的版本)。我想把我的对象进行序列化,但遇到了这个错误:

/usr/lib/python2.7/pickle.pyc in memoize(self, obj)
    242         if self.fast:
    243             return
--> 244         assert id(obj) not in self.memo
    245         memo_len = len(self.memo)
    246         self.write(self.put(memo_len))

有人能告诉我是什么原因导致这个错误,或者我该怎么解决吗?

1 个回答

2

如果你不提供简化版的代码,帮忙就会很困难。不过,dill 有一些内置的检测方法。你可以看看 dill.detect

>>> # trace dill's pickling of objects, by printing out step by step trace 
>>> dill.detect.trace(True)

或者通过检查对象来了解情况。

>>> dill.detect.badobjects(yourfailingobject, depth=1)

还有 dill.detect.badtypes 等等。

你也可以追踪对象之间的关系,比如使用 dill.detect.parentdill.detect.childrendill.detect.reference 等等。

这里有一个使用 dill(加上 objgraph 用于可视化)来追踪循环引用的例子。你可以查看这个链接了解更多:https://github.com/uqfoundation/dill/issues/58

此外,dill 也有一个很长的列表,列出了它不知道如何序列化的内容,这些内容在 dill._objects 中可以找到——至少包括 Python 标准库的前 15 个部分,还有一些其他的内容。

撰写回答