Mixed inheritance between slotted and non slotted classes leads to issues with parallelisation.
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
Research direction
Start with the provided mixed-inheritance reproducer and inspect how the Child instance is copied for multiprocessing, particularly the interaction between dict and slots. The work is done when the copied object retains z and name and the pool example succeeds, with regression coverage for the failing case.
Written by the indexing model from the issue text.
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'
- Dominant language
- Python
- Stars
- 5.8k
- Forks
- 490
- Avg merge
- 3d 12h
- Merged PRs (30d)
- 3
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from python-attrs/attrs
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
python-attrs/attrs#1627 ·
Maintainers usually reply within 1 day
-
Difficulty 3/5 1-2 days Newbie friendliness 68/100
python-attrs/attrs#1637 ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 20/100
python-attrs/attrs#1620 ·
Maintainers usually reply within 1 day
-
Difficulty 3/5 1-2 days Newbie friendliness 55/100
python-attrs/attrs#1596 · 2 comments · 1 reaction ·
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 35/100
python-attrs/attrs#1549 · 3 comments ·
Maintainers usually reply within 1 day
All issues in python-attrs/attrs
Similar issues
-
upstream update
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
conan-io/conan-center-index#31098 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
john-kurkowski/tldextract#382 ·
-
comp/tools duplicate P2 sweeper:risk-compatibility tool/mcp type/bug
Difficulty 1/5 Under an hour Newbie friendliness 88/100
NousResearch/hermes-agent#132042 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
deepset-ai/haystack#13092 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 1-3 hours Newbie friendliness 85/100
feder-cr/invisible_playwright_mcp#1408 ·
Maintainers usually reply within 1 day