sufficiently pythonic code for testing type of function
Fredrik Lundh
fredrik at pythonware.com
Wed Oct 11 05:05:10 EDT 2006
Theerasak Photha wrote:
>> Now the real question : what if the object is not an instance of any of
>> the types, but still support the expected interface ?
>
> Perhaps:
>
> try:
> for attribute in ['foo', 'bar', '__baz__']:
> getattr(mystery_object, '__%s__' % attribute)
> except AttributeError:
> # Do sumthin bout it
>
> Is it wrong to 're-raise' an exception with application-specific
> details within an except clause?
nope, as long as the new exception is provides more accurate information
about what actually happened. something like
try:
do something
except ValueError:
raise RuntimeError("the frobnitz failed to catch the kitten")
can be a lot better than a 30-level traceback that ends with a line
looking something like
fnut.index(gah)
on the other hand, things like this are all too common:
try:
do something
except:
raise Exception("something happened")
also, checking for __method__ is, in general, not the right way to check
if an object implements a given interface. some types use C-level slots
or alternative hooks to provide functionality, and such things are not
always visible from the outside (Python knows how to use them, though).
so if you can, try doing the operation instead, and catch error (if you
really need to check first, use an idempotent operation, if available).
</F>
More information about the Python-list
mailing list