Luciano Ramalho <luci...@ramalho.org> added the comment:

> FYI, the usual term is "data descriptor" instead of "overriding descriptor".

Yes, the Python docs are consistent in always using "data descriptor", but I've 
adopted "overriding descriptor" from Martelli's Python in a Nutshell--in Fluent 
Python I also put a note saying that "data descriptor" is used in the docs. I 
think "overriding descriptor" is more descriptive. In particular, I find 
"non-data descriptor" quite puzzling. But this issue is not about changing the 
jargon.

> Normally the docs for things like property() and cached_property()
> don't mention the term descriptor at all.  From the user point of
> view, that is an implementation detail.

I'd agree, if I wasn't personally bitten by the issue I reported. I was 
refactoring an existing class which had hand-made caches in a couple of methods 
decorated with @property. When I discovered @cached_property, I tried to 
simplify my code by using it, and it broke my code in one place, but not in the 
other. Leonardo Rochael had experience with cached_property and told me about 
the difference.

I suggest a warning noting the different behavior regarding existing instance 
attributes. The warning doesn't need to assume the user knows what is a 
descriptor, but it should in my opinion point to your excellent Descriptor 
HowTo Guide for more information.

> I would suggest a small amendment, and say "cached as a normal attribute with 
> the same name". The choice of attribute isn't arbitrary, it is exactly the 
> same as the cached property.

That's good too.

>> In the future, perhaps we can add an argument to @cached_property
>> to optionally make it produce overriding descriptors.

> That doesn't make any sense to me.  It would defeat the entire mechanism for 
> cached_property().

My idea would be to add a dummy __set__ method if the overriding option was 
True (default would be False). The method could raise an exception. But its 
presence would make @cached_property behave more like @property in the most 
common use case of @property: as an overriding descriptor emulating a read-only 
attribute.

>> If a user replaces a @property with a @cached_property, her 
>> code may or may not break depending on the existence of an 
>> instance attribute with the same name as the decorated method. 

> We've never had a report of an issue like this and I don't expect to see over.

You just did ;-). I filed this issue after spending hours trying to figure out 
what the problem was in my code on my second attempt at using @cached_property. 
I expected @cached_property would work as a drop-in replacement for @property 
when emulating a read-only attribute, and it did not.

> One other possible addition is to note that the attribute is writeable:

Yes, the code snippet you suggested is a good way of saying "this produces a 
non-overriding descriptor". 

However we want to say it, I think it is important to contrast the behavior of 
@cached_property v. @property regarding the presence of attributes with the 
same name.

Cheers and a happy 2021 with two doses of vaccine for you and your loved ones, 
Raymond!

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue42781>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to