[Python-Dev] 'hasattr' is broken by design

Hrvoje Niksic hrvoje.niksic at avl.com
Tue Aug 24 15:37:16 CEST 2010


On 08/24/2010 02:31 PM, Benjamin Peterson wrote:
> 2010/8/24 Hrvoje Niksic<hrvoje.niksic at avl.com>:
>>  The __length_hint__ lookup expects either no exception or AttributeError,
>>  and will propagate others.  I'm not sure if this is a bug.  On the one hand,
>>  throwing anything except AttributeError from __getattr__ is bad style (which
>>  is why we fixed the bug by deriving our business exception from
>>  AttributeError), but the __length_hint__ check is supposed to be an internal
>>  optimization completely invisible to the caller of list().
>
> __length_hint__ is internal and undocumented, so it can do whatever it wants.

Of course, but that's beside the point.  In this case __length_hint__ 
was neither implemented in the class, nor were we aware of its 
existence, and the code still broke (as in the example in previous 
mail).  The point I'm making is that:

a) a "business" case of throwing anything other than AttributeError from 
__getattr__ and friends is almost certainly a bug waiting to happen, and

b) making the proposed change is bound to break real, production code.

I still agree with the proposed change, but I wanted to also point out 
that it will cause breakage and illustrate it with a similar real-world 
example that occurred during migration to python 2.6.


More information about the Python-Dev mailing list