A syntax for Python’s hasattr
It used to be that, if you had a dict
foo and you wanted to see if it had the key
bar, you’d write foo.has_key(bar)
. At some point,1 people decided extending the in
operator to handle this case would be more pythonic, so we
now write bar in foo
. This isn’t limited
to built-in types — it (usually) works by passing
bar to foo’s
__contains__
method.
As I’ve become more accustomed to using the
in
operator in such cases, hasattr
has
started to bother me. In fact, hasattr(foo,
'bar')
feels quite
un-pythonic to me now. Perhaps a has
operator2 could
restore balance to the Force; how do you think this looks?
foo has 'bar'
This could work behind the scenes via a __hasattr__
method, much like the existing __getattr__
,
__setattr__
, and __delattr__
methods.
The odds are really good that something like this has already come up, however, cursory Google searching didn’t reveal anything.
Now, I know what you’re thinking. “Ted,” you
ask, “do we really need additional
__foo__
s? Don’t you think Python
already has way too many of these things?” And, to be
fair, I concede some of that, at least the bit about
__
being ugly.
But syntax aside, I think these things are great and I want more of them. I’m really fond of these Python constructs which allow programmes to override default behavior in a controlled way — they’re Python’s manifestation of what Christophe calls protocol-oriented programming. There’s a reason why I love AMOP so much. When you get right down to it, Python is an acceptable lisp.