gpt4 book ai didi

Python pickle 槽错误

转载 作者:太空狗 更新时间:2023-10-29 18:02:41 27 4
gpt4 key购买 nike

我有一个大型实例,我一直在 pickle 得很好,但最近我在尝试转储它时开始遇到此错误:

  File "/usr/lib/python2.6/copy_reg.py", line 77, in _reduce_ex
raise TypeError("a class that defines __slots__ without "
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled

我不明白这个错误,因为我所有的类似乎都定义了一个 __getstate__ 方法,而且似乎没有一个定义了 __slots__。我在隔离我所做的触发此错误的更改时遇到问题。

我只能假设我的实例深处嵌套了某个对象导致了这种情况。有没有办法获得更多信息?如何找到触发此错误的确切对象的类?

最佳答案

使用二进制协议(protocol)进行 pickle (而不是您似乎默认使用的旧 ASCII 协议(protocol)),您会没事的。观察:

>>> class ws(object):
... __slots__ = 'a', 'b'
... def __init__(self, a=23, b=45): self.a, self.b = a, b
...
>>> x = ws()
>>> import pickle
>>> pickle.dumps(x, -1)
'\x80\x02c__main__\nws\nq\x00)\x81q\x01N}q\x02(U\x01aq\x03K\x17U\x01bq\x04K-u\x86q\x05b.'
>>> pickle.dumps(x)
Traceback (most recent call last):
[[snip]]
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/copy_reg.py", line 77, in _reduce_ex
raise TypeError("a class that defines __slots__ without "
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled
>>>

如您所见,-1 协议(protocol)(意思是“最好、最快和最紧凑的协议(protocol)”)工作得很好,而默认的 0 协议(protocol)(旨在一直兼容 Python 1.5 及更早版本的旧 ascii 协议(protocol))给出了您所观察到的异常。

此外,-1 会更快并且产生更紧凑的结果——您只需要确保正确保存和恢复二进制文件它产生的字符串(因此,例如,如果您正在对文件进行 pickle ,请确保为wb打开后者,只是w ).

如果出于某种原因,这种全能解决方案对您不可用,则可以使用 hack 和技巧(例如,子类 pickle.Pickler,直接使用您的子类的实例而不是作为 pickle.dumps 的基础,覆盖 save 方法,以便它在委托(delegate)给父类(super class)之前跟踪 type(obj),但升级向右,最新的协议(protocol)(-1 在任何给定的 Python 版本上保证是该版本支持的最先进的协议(protocol))无论如何都是一个好主意,如果有的话可行。

关于Python pickle 槽错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3522765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com