You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
With attrs 24.2.0 and 23.2.0, if you use cached_property and try to override it in a child, and access the parent value, you get an AttributeError. We ran into this in our code when converting some classes to use slots.
But attrs still doesn't support "super() calls of overridden cached_property's in slotted classes":
fromfunctoolsimportcached_propertyimportattrs@attrs.define(slots=True)classParent:
@cached_propertydefname(self) ->str:
return"Alice"@attrs.define(slots=True)classChild(Parent):
@cached_propertydefname(self) ->str:
returnf"Bob (son of {super().name})"p=Parent()
print(p.name) # prints Alicec=Child()
print(c.name) # error:
Traceback (most recent call last):
File "foo.py", line 23, in <module>
print(c.name)
^^^^^^
File "<attrs generated getattr __main__.Child>", line 6, in __getattr__
File "foo.py", line 18, in name
return f"Bob (son of {super().name})"
^^^^^^^^^^^^
AttributeError: 'Child' object has no attribute 'name'
Workarounds:
disable slots
don't use cached_property
don't override the method
Elaboration:
I see the special handling is described in the docs and I see in the code that it generates a special __getattr__ that sets the generated value in the slot after being called. Perhaps when constructing a class, attrs should also walk the MRO for cached_propertys and handle any overridden cached_property methods — perhaps create some sort of namespaced/name-manged properties for the parent.
The text was updated successfully, but these errors were encountered:
Hnasar
changed the title
cached_property in slotted classes doesn't work with super from child class
cached_property in slotted classes doesn't work if overridden in child class
Aug 9, 2024
I think this is related to #1288? As we've established there, it seems to be a rather complicated issue and all solutions either led the concept of caching ad absurdum (read: performance impact made it questionable to be worth it) or just added another edge case. :|
With attrs 24.2.0 and 23.2.0, if you use
cached_property
and try to override it in a child, and access the parent value, you get anAttributeError
. We ran into this in our code when converting some classes to use slots.I see there was support added in 24.2.0 for
But attrs still doesn't support "super() calls of overridden cached_property's in slotted classes":
Workarounds:
Elaboration:
I see the special handling is described in the docs and I see in the code that it generates a special
__getattr__
that sets the generated value in the slot after being called. Perhaps when constructing a class, attrs should also walk the MRO forcached_property
s and handle any overriddencached_property
methods — perhaps create some sort of namespaced/name-manged properties for the parent.The text was updated successfully, but these errors were encountered: