在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
,但这也无济于事。
(顺便说一下,我已经解决了这个问题,但我很好奇为什么它不起作用。)
答案 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__
。