Skip to content

gh-90562: Support zero argument super with dataclasses when slots=True#124455

Merged
ericvsmith merged 8 commits intopython:mainfrom
ericvsmith:issue-90562-dataclasses-zero-argument-super
Sep 25, 2024
Merged

gh-90562: Support zero argument super with dataclasses when slots=True#124455
ericvsmith merged 8 commits intopython:mainfrom
ericvsmith:issue-90562-dataclasses-zero-argument-super

Conversation

@ericvsmith
Copy link
Copy Markdown
Member

@ericvsmith ericvsmith commented Sep 24, 2024

@ericvsmith ericvsmith changed the title gt-90562: Support zero argument super with dataclasses when slots=True gh-90562: Support zero argument super with dataclasses when slots=True Sep 24, 2024
@ericvsmith ericvsmith self-assigned this Sep 24, 2024
@ericvsmith ericvsmith requested a review from carljm September 24, 2024 19:25
Copy link
Copy Markdown
Member

@carljm carljm left a comment

Choose a reason for hiding this comment

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

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?

Copy link
Copy Markdown
Member Author

@ericvsmith ericvsmith left a comment

Choose a reason for hiding this comment

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

Thanks for the review, @carljm!

ericvsmith and others added 2 commits September 24, 2024 19:38
Apply review suggestions.

Co-authored-by: Carl Meyer <carl@oddbird.net>
Copy link
Copy Markdown
Member

@carljm carljm left a comment

Choose a reason for hiding this comment

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

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")

@ericvsmith ericvsmith merged commit 5c6e3b7 into python:main Sep 25, 2024
@ericvsmith ericvsmith deleted the issue-90562-dataclasses-zero-argument-super branch September 25, 2024 01:26
gpshead added a commit to gpshead/cpython that referenced this pull request Apr 12, 2026
…_` 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>
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.

2 participants