- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
为什么我下面的自定义异常类没有使用 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)
我确信这个问题源于我缺乏关于如何使类(class)对泡菜友好的知识。有趣的是,当我的类没有扩展 Exception 时,不会出现这个问题。
感谢您的帮助。凯尔
编辑:修复我对 super per shx2 的调用编辑:清理标题/内容
最佳答案
如果您同时使用这两个参数来构造错误消息以传递给父 Exception 类,则当前的答案会失效。我相信最好的方法是在你的异常中简单地覆盖 __reduce__
方法。 __reduce__
方法应该返回一个包含两项的元组。元组中的第一项是您的类(class)。第二项是一个元组,其中包含要传递给类的 __init__
方法的参数。
import pickle
class MyException(Exception):
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
super(MyException, self).__init__('arg1: {}, arg2: {}'.format(arg1, arg2))
def __reduce__(self):
return (MyException, (self.arg1, self.arg2))
original = MyException('foo', 'bar')
print repr(original)
print original.arg1
print original.arg2
reconstituted = pickle.loads(pickle.dumps(original))
print repr(reconstituted)
print reconstituted.arg1
print reconstituted.arg2
关于__reduce__
的更多信息here .
关于python - 如何使具有多个 init args 的自定义异常类可腌制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16244923/
与此问题相关 python: pickling c objects我用 __reduce__ 函数扩展了我的 Python C 扩展: static PyMethodDef Kraken_method
import pandas as pd import numpy as np import matplotlib.pyplot as plt dataset = pd.read_csv("Churn_
我想运行这样的东西: from multiprocessing import Pool import time import random class Controler(object):
我是一名优秀的程序员,十分优秀!