定义类
__slots__(而不是
__getstate__)的类可以是您的祖先类,也可以是您的属性或项的类(或祖先类),直接或间接地:本质上,有
向 引用 图 中有任何对象的类具有您的对象将成为根,因为酸洗需要保存整个图形。
解决这个难题的一个简单方法是使用protocol
-1,这意味着“可以使用的最佳协议pickle”。默认值为基于ASCII的古老协议,该协议对
__slots__vs施加了此限制
__getstate__。考虑:
>>> class sic(object):... __slots__ = 'a', 'b'... >>> import pickle>>> pickle.dumps(sic(), -1)'x80x02c__main__nsicnqx00)x81qx01.'>>> pickle.dumps(sic())Traceback (most recent call last): [snip snip] raise TypeError("a class that defines __slots__ without "TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled>>>
正如你看到的,协议
-1采取
__slots__了事,而默认的协议给你看到了同样的异常。
协议的问题
-1:它生成一个二进制字符串/文件,而不是像默认协议那样的ASCII字符串/文件;最终的腌制文件将无法通过足够古老的Python版本加载。除了关键优势外,优势还
__slots__包括更紧凑的结果和更好的性能。
如果您被迫使用默认协议,则需要准确确定哪个类给您带来了麻烦以及原因。如果是这种情况,我们可以讨论策略(但如果您可以使用该
-1协议,那就更好了,以至于不值得讨论;-),寻找麻烦的类/对象的简单代码检查被证明太复杂了(我在请注意一些基于深度复制的技巧,以获取整个图形的可用表示(以防您想知道)。