hasattr(obj, attr) overloading?

Eric Jacobs x at x.x
Sun Oct 31 20:55:09 EST 1999


claudius at catlover.com wrote:
> 
> Is there a way to overload the hasattr method (by default it calls __getattr__
> and checks for an exception.  However, my __getattr__ can be a heavy hit that
> I'd rather avoid for hasattr calls.)
> 
> If not, perhaps a feature for the next minor revision?

How 'bout:

def hasattr(o, a, orig_hasattr=hasattr):
	if orig_hasattr(o, "__hasattr__"):
		return o.__hasattr__(a)
	return orig_hasattr(o, a)

__builtins__.hasattr = hasattr


This is assuming, of course, that the "heavy hit" won't occur checking for
a __hasattr__ attribute. It also won't work for a C module that wants to
call PyObject_HasAttr[String]. Finally, you'd have to mess around with it
a little bit if you want to check for attributes of a class (the class
will return an unbound method.)

The default argument avoids losing the original reference to the built-in
hasattr. Assigning to the __builtins__ module will allow other (Python)
modules to use the new function.




More information about the Python-list mailing list