不能去除腌制物

时间:2016-06-10 16:50:22

标签: python python-3.4 pickle

在Linux上运行Python 3.4.3。

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中找到了What's new In Python 3.4关于 pickle 的唯一内容,这表明这应该有效。除此之外,只发出不同python版本之间的酸洗。

我也试过设置pickle.HIGHEST_PROTOCOL,但这也无济于事。

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

1 个答案:

答案 0 :(得分:2)

__new__采取额外参数的类需要provide a __getnewargs__ method来告诉pickle多余的参数是什么。

您可以修补SSLProtocol以添加__getnewargs__方法:

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

Python 3.4中pickle的新功能是also supports a __getnewargs_ex__ method可以为__new__提供关键字参数;但是课程仍然需要自己提供__getnewargs__和/或__getnewargs_ex__