gh-105936: Properly update closure cells for __setattr__ and __detattr__ in frozen dataclasses with slots#144021
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Specifying
frozen=Truefor a dataclass adds methods__setattr__and__detattr__to it. These methods reference the class via closure. Ifslots=Trueis also present, then the class is recreated with slots with all methods being copied. Notably, every method referencing the old class via closure in variable__class__is properly updated, but__setattr__and__detattr__reference the old class viacls; hence, they are still referencing the old class instead of the new one. This PR fixes this issue.__setattr__and__delattr__does not work. #105936Additional details:
The issue is present in Python as early as in 3.10. This PR must be backported to 3.14 and possibly 3.13.
Originally this PR was referencing gh-135228, but soon I realized that the issue is not connected to regression in 3.14. There is an older PR #105937 that fixes the issue, but it is heavily outdated.