此代码
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
答案 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), ()