无法取消腌制对象

Cannot unpickle pickled object

运行 Python 3.4.3 linux.

import pickle
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
pickled = pickle.dumps(context)
unpickled = pickle.loads(pickled)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    unpickled = pickle.loads(pickled)
TypeError: __new__() missing 1 required positional argument: 'protocol'

我不怎么腌制,所以如果这是众所周知的,请原谅我。

我环顾四周,发现 this about pickle in the What's new In Python 3.4 表明这应该可行。除此之外,只是在不同 python 版本之间进行酸洗。

我也试过设置 pickle.HIGHEST_PROTOCOL 但这也没有帮助。

(顺便说一句,我已经解决了这个问题,但我很好奇为什么它不起作用。)

类 将额外的参数传递给 __new__ 需要 provide a __getnewargs__ method 告诉 pickle 额外的参数是什么。

你可以通过 monkey-patch SSLProtocol 添加一个 __getnewargs__ 方法:

ssl.SSLContext.__getnewargs__ = lambda self: (self.protocol,)

pickle 在Python 3.4 中的新特性是also supports a __getnewargs_ex__ method 可以为__new__ 提供关键字参数;但是类还是需要自己提供__getnewargs__and/or__getnewargs_ex__