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

Benjamin Peterson benjamin at python.org
Mon Aug 23 23:50:50 CEST 2010


2010/8/23 Michael Foord <fuzzyman at voidspace.org.uk>:
>  On 24/08/2010 00:40, Nick Coghlan wrote:
>>>
>>> Properties are allowed to do whatever the heck they want. That doesn't
>>> mean
>>> that you have to execute code to determine whether they exist or not.
>>
>> If you don't want to execute properties, do the lookup on the type,
>> not the instance (obviously, you know the dance you need to do, since
>> you've linked the code where you did it). Having apparently simple
>> query operations like hasattr/getattr/len/etc execute arbitrary code
>> is where much of the language's flexibility comes from, so I don't see
>> how it can really be surprising when it happens.
>
> Certainly that is true for len. getattr obviously involves invoking code if
> you are fetching a property or descriptor. No idea how you conclude that
> hasattr executing code adds flexibility to the language though.
>
> Yes I know the dance (walking the mro fetching the attribute out of the
> appropriate type __dict__ or the instance dict - or looking on the metaclass
> if the object you are introspecting is a type itself), it is just not
> trivial - which is why I think it is a shame that people are forced to
> implement it just to ask if a member exists without triggering code
> execution.

Sounds like something for a new function.



-- 
Regards,
Benjamin


More information about the Python-Dev mailing list