Define __getattribute__() instead of __getattr__() on slotted classes with cached properties #1291
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.
Summary
Fix #1288
Method
__getattribute__()
is documented as the "way to to actually get total control over attribute access" so we change the implementation of slotted classes with cached properties by defining a__getattribute__()
method instead of__getattr__()
previously.Just changing that preserves the current behaviour, according to the test suite, but also makes sub-classing work better, e.g. when the subclass is not an attr-class and also defines a custom
__getattr__()
as evidenced in added test from #1288.In tests, we replace most custom
__getattr__()
definitions by equivalent__getattribute__()
ones, except in regression tests where__getattr__()
is explicitly involved. Also, in test_slots_with_multiple_cached_property_subclasses_works(), we replace theif hasattr(super(), "__getattr__"):
by atry:
/except AttributeError:
as usinghasattr(..., "__getattribute__")
would be meaningless since__getattribute__()
is always defined.Pull Request Check List
main
branch – use a separate branch!Our CI fails if coverage is not 100%.
.pyi
).tests/typing_example.py
.attr/__init__.pyi
, they've also been re-imported inattrs/__init__.pyi
.docs/api.rst
by hand.@attr.s()
have to be added by hand too.versionadded
,versionchanged
, ordeprecated
directives.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 22.2.0, the next version is gonna be 22.3.0.
If the next version is the first in the new year, it'll be 23.1.0.
.rst
and.md
files is written using semantic newlines.changelog.d
.