Python Basic Doubt

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sat Aug 10 15:32:10 EDT 2013


On Sat, 10 Aug 2013 20:00:58 +0200, Xavi wrote:

> Now I have one doubt, I use 'is' to compare basic types in python 3, for
> example .-
> 
> v = []
> if type(v) is list:
>      print('Is list...')

No, do not do this. This is unnecessarily restrictive.

> Because I think it is more clear and faster than .- 

Clear? Maybe. Clear, but does the wrong thing. Using type rejects 
subclasses, which is normally a bad idea. Using isinstance accepts 
subclasses, which is what we nearly always should do.

As for being faster -- who cares? The difference between calling type and 
calling isinstance is about 0.02 microseconds on my slow computer. You 
should not try to optimize things which are so unimportant.

The first rule of optimization: Don't do it.
For experts only: Don't do it yet.

Until you have profiled your application, and discovered calling 
isinstance is the bottleneck making your application too slow, you are 
wasting your time trying to guess what will make it go faster.



> type(v) == [].__class__

You should not do that either. Names starting and ending with double-
underscore are reserved for Python. They are not quite private 
implementation details, but you almost never need to use them directly.

Why keep a dog and then bark yourself? Python will check __class__ for 
you, when and if needed. That is not your job. It is very rare to need to 
use __dunder__ attributes by hand.

> ... or ... isinstance(v, list)

That's the right solution, 99.9% of the time.

Actually, 99% of the time you should not call isinstance at all, but just 
catch any errors that occur; or better still, only catch them if you can 
do something about it. Otherwise, just allow the exception to propagate 
to the caller, who may catch it. Calling isinstance should be rare; 
calling type to check for an exact class even rarer.


-- 
Steven



More information about the Python-list mailing list