[Tutor] atr in dir Vs. hasattr

Steven D'Aprano steve at pearwood.info
Wed Mar 16 14:19:34 CET 2011


Wayne Werner wrote:

> However, rare is the occasion that you should use either of these. If you're
> doing something like:
> 
> if hasattr(myobj, 'something'):
>    myobj.something()
> else:
>     print "blah blah blah"
> 
> then what you really should be doing is:
> 
> try:
>     myobj.something()
> except AttributeError:
>     print "blah blah blah"
> 
> because 1) you avoid the overhead of an extra(?) try-except block, 

But there is no extra try-except block, because you've just explained 
that hasattr itself contains a try-except block. The only difference is 
whether it is explicit in your own code, or implicit inside hasattr.

More likely though, hasattr (like its cousins getattr and setattr) will 
be used when the attribute name isn't known until runtime, rather than 
for fixed strings:

name = get_some_name_from_somewhere(arg)
if hasattr(myobj, name):
     result = getattr(myobj, name)
else:
     do_something_else()


Of course, you could do this instead:


try:
     result = getattr(myobj, name)
except AttributeError:
     do_something_else()


or even this:

result = getattr(myobj, name, default_value)



-- 
Steven



More information about the Tutor mailing list