Closed dlax closed 4 months ago
Comparing dlax:issue-1288
(1d845e3) with main
(edcaf04)
✅ 12
untouched benchmarks
Closing due to https://github.com/python-attrs/attrs/issues/1288#issuecomment-2227820600 – thank you very much for the work though! Sometimes it takes an experiment to find out.
Summary
Fix https://github.com/python-attrs/attrs/issues/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!.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
.