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

Nick Coghlan ncoghlan at gmail.com
Tue Aug 24 00:25:03 CEST 2010


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)

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia


More information about the Python-Dev mailing list