[Python-ideas] `issubclass` shouldn't be raising exceptions for non-type inputs
Guido van Rossum
guido at python.org
Mon Nov 29 04:01:09 CET 2010
On Sun, Nov 28, 2010 at 4:13 PM, Steven D'Aprano <steve at pearwood.info> wrote:
> cool-RR wrote:
>
>>> Unfortunately it would be a backwards incompatible change. Currently
>>> catching the TypeError from issubclass is a way of detecting that an
>>> object
>>> *isn't* a type.
>>>
>>
>> Who is doing that?! What's wrong with something like `isinstance(thing,
>> (type, types.ClassType))`?
>
> Is that a serious question? Trying something, and catching the exception if
> it fails, is a general Python idiom. In many case, it's often considered
> more "pythonic" to write:
>
> try:
> handle normal case (which might fail)
> except SomeException:
> handle exceptional case
>
> than:
>
> if operation will fail:
> handle exceptional case
> else:
> handle normal case (which hopefully won't fail)
>
>
> since at least Python 1.5. It's been long considered "best practice" under
> many circumstances to catch exceptions rather than to try to preemptively
> guess what might go wrong.
Hm. The try/except version should IMO be used as a last resort only
(similar to using eval() / exec()). It usually reads more clumsily
than the if-based version, and often it is not clear to the reader
what error condition is being tested. One of the most common things I
see in Python code reviews at work is try/except clauses that catch an
overly general exception and/or out a try/except around an overly long
piece of code, masking potential errors and obscuring the meaning of
the code. (Another common one is legitimate try/except clauses that
are nevertheless lacking a comment explaining what error condition is
being caught and why.)
That is not to say that try/except should not be used, but I think the
question of what's wrong with an explicit test should not be cast off
as rhetorical.
As to the original issue, Antoine got it: issubclass(X, Y) does not
make sense if you're not even sure that X is a class.
--
--Guido van Rossum (python.org/~guido)
More information about the Python-ideas
mailing list