fix: rewrite __class__ closure cells of methods hidden in decorators - #1618
Open
TrueFurina wants to merge 1 commit into
Open
fix: rewrite __class__ closure cells of methods hidden in decorators#1618TrueFurina wants to merge 1 commit into
TrueFurina wants to merge 1 commit into
Conversation
When a slotted class is re-created by _ClassBuilder, closure cells that reference the old class (baked in by no-arg super() or __class__) are rewritten to point at the new class. Methods wrapped in decorators hide their function - and thus the __class__ cell baked into it - behind the wrapper's own closure, so those cells were never rewritten. This caused no-arg super() inside such wrapped methods to raise: TypeError: super(type, obj): obj is not an instance or subtype of type Collect functions referenced by other functions' closures as well, so their cells are rewritten too. Fixes python-attrs#1038.
TrueFurina
marked this pull request as ready for review
September 3, 2026 10:38
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
When a slotted class is re-created by _ClassBuilder, closure cells that reference the old class (baked in by no-arg super() or class) are rewritten to point at the new class. Methods wrapped in decorators hide their function - and thus the class cell baked into it - behind the wrapper's own closure, so those cells were never rewritten. This caused no-arg super() inside such wrapped methods to raise:
TypeError: super(type, obj): obj is not an instance or subtype of type
Collect functions referenced by other functions' closures as well, so their cells are rewritten too. Fixes #1038.
Summary
Pull Request Checklist
mainbranch..pyi).typing_tests/baseline.pyor, if necessary,typing_tests/mypy.py.attr/__init__.pyi, they've also been re-imported inattrs/__init__.pyi.docs/api.rstby hand.@attr.s()and@attrs.define()have to be added by hand too.versionadded,versionchanged, ordeprecateddirectives.The next version is the second number in the current release + 1.
The first number represents the current year.
So if the current version on PyPI is 26.2.0, the next version is gonna be 26.3.0.
If the next version is the first in the new year, it'll be 27.1.0.
.rstand.mdfiles is written using semantic newlines.changelog.d.