Description
Bug report
Bug description:
Code dating back to Python 2 had to do super(OwnClassName, self)
instead of super()
. Modules designed to be reloadable could not use the super(OwnClassName, self)
syntax in their non-constructor method, as OwnClassName
was re-binded to the class of the new module, rather than the class that had the name when the object was constructed (which differs when the object was constructed before a reload). Therefore, such modules defined classes like this:
class Subclass(Superclass):
def __init__(self):
self.__parent = super(Subclass, self)
def method1(self, arg):
self.__parent.method1(arg + 2)
Python 3.14.0a1+ breaks existing code using this trick on subclasses of multiprocessing.Process
.
For example:
import multiprocessing
class MyProcess(multiprocessing.Process):
def __init__(self, target=None, args=(), kwargs={}):
self.__parent = super(MyProcess, self)
self.__parent.__init__(target=target, args=args, kwargs=kwargs)
def run(self):
self.__parent.run()
if __name__ == "__main__":
p = MyProcess()
p.start()
worked fine on previous versions, but now errors with:
Traceback (most recent call last):
File "/home/dev-irc/Limnoria/repro.py", line 12, in <module>
p.start()
~~~~~~~^^
File "/home/dev-irc/.local-py-git/lib/python3.14/multiprocessing/process.py", line 121, in start
self._popen = self._Popen(self)
~~~~~~~~~~~^^^^^^
File "/home/dev-irc/.local-py-git/lib/python3.14/multiprocessing/context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/dev-irc/.local-py-git/lib/python3.14/multiprocessing/context.py", line 300, in _Popen
return Popen(process_obj)
File "/home/dev-irc/.local-py-git/lib/python3.14/multiprocessing/popen_forkserver.py", line 35, in __init__
super().__init__(process_obj)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/dev-irc/.local-py-git/lib/python3.14/multiprocessing/popen_fork.py", line 20, in __init__
self._launch(process_obj)
~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/dev-irc/.local-py-git/lib/python3.14/multiprocessing/popen_forkserver.py", line 47, in _launch
reduction.dump(process_obj, buf)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "/home/dev-irc/.local-py-git/lib/python3.14/multiprocessing/reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
_pickle.PicklingError: first argument to __newobj__() must be <class 'super'>, not <class '__main__.MyProcess'>
when serializing super object
when serializing dict item '_MyProcess__parent'
when serializing MyProcess state
when serializing MyProcess object
Full version string: Python 3.14.0a1+ (heads/main:c8fd4b12e3d, Oct 18 2024, 22:51:39) [GCC 12.2.0] on linux
CPython versions tested on:
3.14, CPython main branch
Operating systems tested on:
Linux
Linked PRs
Metadata
Metadata
Assignees
Labels
Projects
Status
Status