Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的自定义异常unpickle失败了_Python_Python 2.7_Python 3.x - Fatal编程技术网

Python 为什么我的自定义异常unpickle失败了

Python 为什么我的自定义异常unpickle失败了,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我得到以下回溯: import pickle class ABError(Exception): def __init__(self, a, b): super(ABError, self).__init__(a) self.a = a self.b = b class ABCDError(ABError): def __init__(self, a, b, c, d): super(ABCDError, sel

我得到以下回溯:

import pickle

class ABError(Exception):
    def __init__(self, a, b):
        super(ABError, self).__init__(a)
        self.a = a
        self.b = b

class ABCDError(ABError):
    def __init__(self, a, b, c, d):
        super(ABCDError, self).__init__(a, b)
        self.c = c
        self.d = d

err = ABCDError("aaaaa", "bbbbb", "ccccc", "ddddd")

pickled_err = pickle.dumps(err)

original_err = pickle.loads(pickled_err)  # Fails
回溯(最近一次呼叫最后一次):
文件“pickle_pain.py”,第19行,在
原始错误=pickle.load(pickled错误)#失败
文件“/usr/lib/python2.7/pickle.py”,第1388行,装入
返回Unpickler(file.load())
文件“/usr/lib/python2.7/pickle.py”,第864行,已加载
调度[键](自身)
文件“/usr/lib/python2.7/pickle.py”,第1139行,在load\u reduce中
值=func(*args)
TypeError:\uuuu init\uuuuu()正好接受5个参数(给定2个)
我在谷歌上搜索了一下,但很难找到一个好的答案来解释为什么会发生这种情况,我也不急于开始学习pickle序列化格式来逐步解决这个问题:-/

编辑:python3中的行为与python3相同,但错误消息稍微好一些:

Traceback (most recent call last):
  File "pickle_pain.py", line 19, in <module>
    original_err = pickle.loads(pickled_err)  # Fails
  File "/usr/lib/python2.7/pickle.py", line 1388, in loads
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 864, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1139, in load_reduce
    value = func(*args)
TypeError: __init__() takes exactly 5 arguments (2 given)
回溯(最近一次呼叫最后一次):
文件“pickle_pain.py”,第19行,在
原始错误=pickle.load(pickled错误)#失败
TypeError:\uuuu init\uuuu()缺少3个必需的位置参数:“b”、“c”和“d”

在我看来,这是因为
异常
类重写了
\uuuu setstate\uuuuu
?只是一个提示,试图为您指出一个有用的方向:显然,在取消勾选时,系统尝试仅使用两个参数调用init。在Java环境中,通常要求有一个默认构造函数,通过反射调用该构造函数,并通过属性设置器方法设置所有其他字段。或者您需要采用这种方法:将init更改为在没有附加参数的情况下工作,并让取消勾选在init完成后进行设置,或者您可以使用pickle找到一种方法,在取消勾选时告诉它需要向init提供的附加参数。您可以进一步简化您的最小示例,因为酸洗和解酸洗一个
ABError
会导致相同的错误。谢谢-我已经提出了一个更简单的版本,可以复制
Traceback (most recent call last):
  File "pickle_pain.py", line 19, in <module>
    original_err = pickle.loads(pickled_err)  # Fails
TypeError: __init__() missing 3 required positional arguments: 'b', 'c', and 'd'