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

Michael Foord fuzzyman at voidspace.org.uk
Tue Aug 24 09:40:05 CEST 2010


  On 24/08/2010 01:25, Nick Coghlan wrote:
> On Tue, Aug 24, 2010 at 8:15 AM, Nick Coghlan<ncoghlan at gmail.com>  wrote:
>> Now, it may be worth considering an addition to the inspect module
>> that was basically:
>>
>> def getattr_static(obj, attr):
>>     """Retrieve attributes without triggering dynamic lookup via the
>> descriptor protocol,
>>         __getattr__ or __getattribute__.
>>
>>         Note: this function may not be able to retrieve all attributes
>> reported by dir(obj)
>>     """
>>     try:
>>         instance_dict = object.__getattribute__(obj, "__dict__")
>>     except AttributeError:
>>         pass
>>     else:
>>         if attr in instance_dict:
>>             return instance_dict[attr]
>>     for entry in getmro(obj.__class__):
>>         try:
>>             return entry.__dict__[attr]
>>         except AttributeError:
>>             pass
> Second attempt with a default value parameter and correctly raising
> AttributeError if not found:
>
> _sentinel = object()
> def getattr_static(obj, attr, default=_sentinel):
>      """Retrieve attributes without triggering dynamic lookup via the
>          descriptor protocol,  __getattr__ or __getattribute__.
>
>          Note: this function may not be able to retrieve all attributes
>          reported by dir(obj)
>      """
>      try:
>          instance_dict = object.__getattribute__(obj, "__dict__")
>      except AttributeError:
>          pass
>      else:
>          if attr in instance_dict:
>              return instance_dict[attr]
>      for entry in getmro(obj.__class__):
>          try:
>              return entry.__dict__[attr]
>          except AttributeError:
>              pass
>      if default is not _sentinel:
>          return default
>      raise AttributeError(attr)
>

This doesn't correctly handle the case where obj is a type object or obj 
uses __slots__.

If I have time (currently on vacation with only intermittent internet 
access) I'll provide an update.

Michael


> Cheers,
> Nick.
>


-- 
http://www.ironpythoninaction.com/



More information about the Python-Dev mailing list