Description
Mixed inheritance between slotted and non-slotted classes seems to lead to some issues when object are copied for parallelization.
The following code example does not work and raises: AttributeError: 'Child' object has no attribute 'z'
import attrs
import multiprocessing as mp
@attrs.define(slots=False, kw_only=True)
class Parent:
name: str
@attrs.define
class Child(Parent):
x: float
def __attrs_post_init__(self):
self.z = self.x + 2
def arg_plus_z(self, arg):
return self.z + arg
test = Child(3, name = "as")
with mp.Pool(processes=4) as pool:
result = pool.map(test.arg_plus_z, range(100))
whilst adding slots=False
to the child class or registering z using z: float = attrs.field(default = None, init=False)
does work:
import attrs
import multiprocessing as mp
@attrs.define(slots=False, kw_only=True)
class Parent:
name: str
@attrs.define(slots=False)
class Child(Parent):
x: float
def __attrs_post_init__(self):
self.z = self.x + 2
def arg_plus_z(self, arg):
return self.z + arg
test = Child(3, name = "as")
with mp.Pool(processes=4) as pool:
result = pool.map(test.arg_plus_z, range(100))
It seems like the object copy of test
passed to each one of the processes does not copy the __dict__
(which includes z
and name
) but only the __slots__
.
I know that according to the attrs documentation mixed inheritance between slotted and non slotted classes is considered a bad practice. I stumbled across this by accident and it might also be more of a missing feature than a bug.
Meta:
- attrs-version: '21.4.0'
- python-version: '3.9.13'