It seems like you can get some of the benefits of this proposal without backward compat issues.

Instead of changing things so AttributeError from __getattribute__ or a descriptor no longer calls __getattr__, just add a new subclass that doesn't, and change the Descriptor HOWTO to suggest using that subclass (with a bit of discussion that says you can use AttributeError if you want to trigger __getattr__, but usually you won't).

That wouldn't fix any current code, but it also wouldn't break any code that intentionally uses the features as documented. And it would make it easy to write correct new code.

One more thing:
Without descriptor, unexpected AttributeError could only come from overriding __getattribute__, which is a rare case, although still an imperfection.
Is that really an imperfection? It says right there in the docs for __getattribute__ that you can delegate to __getattr__ by raising AttributeError, so if someone does that, presumably it's intentional. It's not like the case with descriptors, where you have to think through the interaction of multiple features to figure out that raising an AttributeError will call __getattr__, and therefore many such uses are probably bugs.

Sent from my iPhone

On Nov 27, 2015, at 09:49, 王珺 <> wrote:

Hello everyone:

I'm suggesting a modification to the AttributeError/__getattr__ mechanism, see issue25634:

I used __getattr__ sometimes, and descriptor especially property is so widely used. I wonder whether someone had encountered the same problem with me.

However, this is a complicated problem including performance issues, and backward compatibility.

Thanks for your attention,
Jun Wang
Python-ideas mailing list
Code of Conduct: