Skip to content

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

Draft
gpshead wants to merge 1 commit intopython:3.13from
gpshead:backport-8a398bf-3.13
Draft

[3.13] gh-105936: Properly update closure cells for __setattr__ and __delattr__ in frozen dataclasses with slots (GH-144021)#148476
gpshead wants to merge 1 commit intopython:3.13from
gpshead:backport-8a398bf-3.13

Conversation

@gpshead
Copy link
Copy Markdown
Member

@gpshead gpshead commented Apr 12, 2026

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
Member Author

gpshead commented Apr 13, 2026

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.

Sign up for free to 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.

1 participant