小编典典

调试Pickle

python

我正在尝试Pickle相当复杂的对象层次结构并获取异常:

pickle.PicklingError: Can't pickle <class 'function'>: attribute lookup builtins.function failed

有没有一种合理的方法可以用来测试对象层次结构的可选择性?我的目标是找到有问题的功能的位置


阅读 225

收藏
2020-12-20

共1个答案

小编典典

为此,我将使用dill,它可以将python中的几乎所有内容序列化。Dill还有一些很好的工具,可以帮助您了解在代码失败时导致酸洗失败的原因。

>>> import dill
>>> dill.loads(dill.dumps(your_bad_object))
>>> ...
>>> # if you get a pickling error, use dill's tools to figure out a workaround
>>> dill.detect.badobjects(your_bad_object, depth=0)
>>> dill.detect.badobjects(your_bad_object, depth=1)
>>> ...

如果绝对需要,则可以使用莳萝badobjects(或其他检测功能之一)递归地深入对象的参考链,并弹出无法钻探的对象,而不是像上面那样在每个深度调用它。

同样,objgraph对测试套件也很方便。

>>> # visualize the references in your bad objects
>>> objgraph.show_refs(your_bad_object, filename='your_bad_object.png')
2020-12-20