为什么我下面的自定义异常类不能使用 pickle 模块正确序列化/反序列化?
import pickle
class MyException(Exception):
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
super(MyException, self).__init__(arg1)
e = MyException("foo", "bar")
str = pickle.dumps(e)
obj = pickle.loads(str)
此代码引发以下错误:
Traceback (most recent call last):
File "test.py", line 13, in <module>
obj = pickle.loads(str)
File "/usr/lib/python2.7/pickle.py", line 1382, in loads
return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 1133, in load_reduce
value = func(*args)
TypeError: __init__() takes exactly 3 arguments (2 given)
我敢肯定,这个问题源于我对如何使班级泡菜友好缺乏了解。有趣的是,当我的类不扩展 Exception 时,不会出现此问题。
谢谢你的帮助。凯尔
编辑:修复我对 super per shx2 的调用 编辑:清理标题/内容
原文由 kylejmcintyre 发布,翻译遵循 CC BY-SA 4.0 许可协议
使
arg2
可选:基础
Exception
类定义了一个.__reduce__()
方法 来使扩展(基于 C)类型 picklable 并且该方法只需要 一个 参数(即.args
);请参阅 C 源代码中的BaseException_reduce()
函数。最简单的解决方法是使额外的参数可选。
__reduce__
方法 还 包括除.args
和.message
之外的任何其他对象属性,并且您的实例已正确重新创建: