gh-90562: Support zero argument super with dataclasses when slots=True#124455
gh-90562: Support zero argument super with dataclasses when slots=True#124455ericvsmith merged 8 commits intopython:mainfrom ericvsmith:issue-90562-dataclasses-zero-argument-super
Conversation
… showing that the original class, if saved, will have in incorrect __class__ value.
carljm
left a comment
There was a problem hiding this comment.
Thanks for working on this!
There is the possible case where all methods of a class are decorated with opaque decorators that don't use functools.wraps, and thus we have no route to find the cell to update, and thus this approach simply fails. Should this case be mentioned in the tests? In the docs? Would it be worth explicitly introducing a __classcell__ member on classes through which the cell can reliably be accessed, so as to avoid this problem?
ericvsmith
left a comment
There was a problem hiding this comment.
Thanks for the review, @carljm!
Apply review suggestions. Co-authored-by: Carl Meyer <carl@oddbird.net>
…loop; minor change to comments; fix a test.
carljm
left a comment
There was a problem hiding this comment.
Looks good!
(Discussed in person that if people hit the "all methods use an opaque decorator" case, the answer is "fix the decorator to use functools.wraps")
…_` 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>
📚 Documentation preview 📚: https://cpython-previews--124455.org.readthedocs.build/