New submission from liugang <liugan...@163.com>:

-- code 1
import pickle

class MyException():
    def __init__(self, desc, *, item):
        super().__init__()
        self.desc = desc
        self.item = item

    def __getnewargs_ex__(self):
        print('called in {}.__getnewargs_ex__'.format(self.__class__.__name__))
        return (self.desc,), self.__dict__

e = MyException('testing', item='cpu')
s = pickle.dumps(e, protocol=-1)

x = pickle.loads(s)


-- code 2
import pickle

class MyException(Exception):
    def __init__(self, desc, *, item):
        super().__init__()
        self.desc = desc
        self.item = item

    def __getnewargs_ex__(self):
        print('called in {}.__getnewargs_ex__'.format(self.__class__.__name__))
        return (self.desc,), self.__dict__

e = MyException('testing', item='cpu')
s = pickle.dumps(e, protocol=-1)

x = pickle.loads(s)

in code 1, the class is inherted from object, __getnewargs_ex__ is called and 
the returned args, kwargs are passed to __new__/__init__ to construct object 
when pickling.

in code 2, the class is inherted from Exception, __getnewargs_ex__ is not 
called, and rasie an exception of "TypeError: __init__() missing 1 required 
positional argument: 'desc'"

I think this is not python issue, it should be the right behavior of Exception. 
I want to known why it is, and how to implement the logic in code 2 (passing 
keyword only parameter to __new__/__init__ when pickling for class inherted 
from Exception)

----------
components: Library (Lib)
messages: 347178
nosy: liugang93
priority: normal
severity: normal
status: open
title: pickling instance which inherited from Exception with keyword only 
parameter
type: behavior
versions: Python 3.5

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue37489>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to