无法取消腌制对象
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__
运行 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__