gh-135228: Properly update closure cells for __setattr__ and __detattr__ in frozen dataclasses with slots
#144021
+39
−7
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.More details in these comments: 1, 2.
Any help with tests for the issue would be appreciated. I guess just checking that
__setattr__and__delattr__reference the new class would be sufficient.