[Python-Dev] Evil isinstance()

Guido van Rossum guido@python.org
Sun, 31 Mar 2002 17:19:55 -0500


> Good point, but... if a user-defined class raises TypeError when I try
> to add 0 to an instance thereof, then I _can't_ use said instance as a
> number... whether because of a bug in said class, or because said class
> is not intended to be number-like, I *can't* use it, so I won't.  I will
> then similarly discover I can't use it as a string either, and end up by
> raising TypeError because by hypothesis I don't know what else to do.

But hiding the true source of the error.  If there was a bug in the
user code, I'd like to hear about *that*, not about your inability to
deal with it.  Otherwise, why don't you just use a bare "except:"
clause <sarcastic wink>?

> This doesn't seem so much of a problem to me to warrant rejecting
> perfectly good numberlike and stringlike classes' instances, by
> isinstance'ing away.

Agreed, and I think the solution ought to be sought in asking a
question involving hasattr().

> __int__ may well lose information -- that's how it's defined, after
> all -- but having it might be taken as one possible test of
> numberhood

Unfortunately, non-numeric types are known to implement __int__ for
some obscure purpose.

> > This leaves me in the uncomfortable position that I don't know
> > what to recommend. :-(
> 
> In your shoes, I'd recommend PEP 246 -- since, if I were in your
> shoes, I'd have approved it long ago.  (We don't need to have
> interfaces as a distinct concept from types/classes to approve PEP
> 246 -- any types can serve as 'protocols' to make PEP 246 a
> reality).  It would offer a very good solution to problems in this
> category, in my opinion.

Maybe you can summarize it again using a different vocabulary?  I find
that PEP very hard to read, but I recall liking your informal
explanation of it.  Unfortunately I don't recall enough of that
explanation to go ahead and approve the PEP (I have no idea what
effect that would have).

--Guido van Rossum (home page: http://www.python.org/~guido/)