How to make a custom exception class with multiple init args pickleable

前端 未结 4 1403
醉梦人生
醉梦人生 2021-01-31 02:46

Why does my custom Exception class below not serialize/unserialize correctly using the pickle module?

import pickle

class MyException(Exception):
    def __ini         


        
4条回答
  •  盖世英雄少女心
    2021-01-31 03:25

    The current answers break down if you're using both arguments to construct an error message to pass to the parent Exception class. I believe the best way is to simply override the __reduce__ method in your exception. The __reduce__ method should return a two item tuple. The first item in the tuple is your class. The second item is a tuple containing the arguments to pass to your class's __init__ method.

    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
    

    More info about __reduce__ here.

提交回复
热议问题