如何腌制继承的异常?

时间:2018-04-08 08:18:32

标签: python pickle

此代码

bla   # global

print from func: bla    # readonly global

local variable 'p' referenced before assignment  # same named local var confusion

bla    # global
blubb  # changed global

引发错误:

import pickle
class Error(Exception):
    def __init__(self):
        super().__init__("Some error message")   

c = Error()    
a = pickle.dumps(c)
b = pickle.loads(a)

但是这段代码:

...
    b = pickle.loads(a)
TypeError: __init__() takes 1 positional argument but 2 were given

工作正常。

问题:如何挑选从Python基础异常对象继承的对象?

Python版本:3.6.3

1 个答案:

答案 0 :(得分:3)

BaseException实现了一个__reduce__ method,它返回一个类型和值为self.args的元组(如果.args之外还有更多属性,则包含第三个值):

>>> Error().__reduce__()
(<class '__main__.Error'>, ('Some error message',))

这个元组被腌制并且在取消渲染时,用于重新创建实例。该类还实现了__setstate__,如果__reduce__返回元组中有第三个元素,则会调用它,但这里没有相关性。

您必须提供__reduce__的不同实现:

class Error(Exception):
    def __init__(self):
        super().__init__("Some error message")
    def __reduce__(self):
        return type(self), ()