python - 如何 pickle 继承的异常?

标签 python pickle

这段代码

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

但是这段代码:

import pickle
class MyBaseException:
    def __init__(self, msg):
        self.msg = msg

class Error(MyBaseException):
    def __init__(self):
        super().__init__("Some error message")

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

工作正常。

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

Python 版本:3.6.3

最佳答案

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

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

这个元组被 pickle 并且当 unpickling 时,用于重新创建实例。该类还实现了 __setstate__ ,如果 __reduce__ 返回元组中有第三个元素,将调用它,但这与此处无关。

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

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

关于python - 如何 pickle 继承的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49715881/

相关文章:

python - 将类实例序列化为 JSON

python - pickle 堆可以炒吗?

自己类型的python静态字段

Python:当父类(super class)接受不同的参数时,正确的初始化方法?

Python CGI 脚本不会在 Linux 上打印希伯来语

python - 从 S3 Bucket Django 导入静态文件时出错

python - 在磁盘上存储 Python 字典的有效方法?

python - 从源代码 : default pickle behavior changed 编译的 Pandas

python - 使用 cPickle 通过 XML-RPC 发送复合数据类型

python 上下文管理器不传递异常