Skip to content

[3.13] gh-105936: Properly update closure cells for __setattr__ and __delattr__ in frozen dataclasses with slots (GH-144021) - #148476

Merged
gpshead merged 2 commits into
python:3.13from
gpshead:backport-8a398bf-3.13
Apr 26, 2026
Merged

[3.13] gh-105936: Properly update closure cells for __setattr__ and __delattr__ in frozen dataclasses with slots (GH-144021)#148476
gpshead merged 2 commits into
python:3.13from
gpshead:backport-8a398bf-3.13

Conversation

@gpshead

Copy link
Copy Markdown
Member

gh-105936: Properly update closure cells for __setattr__ and __delattr__ in frozen dataclasses with slots (GH-144021) (cherry picked from commit 8a398bf)

The cherry-pick required additional changes beyond the original commit because 3.13 lacks the __class__ closure cell fixup machinery that was added in 3.14 by GH-124455 (gh-90562). Specifically:

Co-authored-by: Sviataslau 35541026+Prometheus3375@users.noreply.github.com

…_` and `__delattr__` in frozen dataclasses with slots (pythonGH-144021)
pythongh-105936: Properly update closure cells for `__setattr__` and `__delattr__` in frozen dataclasses with slots (pythonGH-144021)
(cherry picked from commit 8a398bf)
The cherry-pick required additional changes beyond the original commit
because 3.13 lacks the `__class__` closure cell fixup machinery that
was added in 3.14 by pythonGH-124455 (pythongh-90562). Specifically:
- Backported `_update_func_cell_for__class__()` helper function and the
closure fixup loop in `_add_slots()` from pythonGH-124455. Without these,
renaming the closure variable from `cls` to `__class__` has no effect
because nothing updates the cell when the class is recreated with slots.
- Changed `_add_slots()` to use `newcls` instead of reusing `cls` for the
recreated class, so both old and new class references are available for
the fixup loop.
- Replaced `assertNotHasAttr` with `assertFalse(hasattr(...))` in tests
(assertNotHasAttr was added in 3.14).
- Dropped `test_original_class_is_gced` additions (that test does not
exist on 3.13; it was added by pythonGH-137047 for pythongh-135228 which was not
backported to 3.13).
Co-authored-by: Prometheus3375 <prometheus3375@gmail.com>
Co-authored-by: Sviataslau <35541026+Prometheus3375@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@gpshead

Copy link
Copy Markdown
MemberAuthor

The is left as a Draft because it required more changes and backporting pieces of some other stuff that is already in 3.14 in order for it to be possible on 3.13. Closer review required.

@JelleZijlstraJelleZijlstra left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes sense but I think we need a small fixup, I'll send a PR for that on master first.

Comment threadLib/dataclasses.py Outdated
Comment threadLib/dataclasses.py Outdated
pythonGH-148948)
pythongh-148947: dataclasses: fix error on empty __class__ cell (pythonGH-148948)
Also add a test demonstrating the need for the existing "is oldcls" check.
(cherry picked from commit 6d7bbee)
Consolidates the news entries given pythonGH-148947 bug was never present in the 3.13
branch
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@gpshead
gpsheadforce-pushed the backport-8a398bf-3.13 branch from 3abfebc to 678cc46CompareApril 25, 2026 18:43
@gpshead
gpshead marked this pull request as ready for review April 25, 2026 18:44
@gpshead
gpshead merged commit 9651429 into python:3.13Apr 26, 2026
45 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gpshead@JelleZijlstra