type() vs. isinstance() in Python
One elementary error people make is using the type()
function where isinstance()
would be more appropriate1.
If you’re checking to see if an object has a certain type, you want isinstance()
as it checks to see if the object passed in the first argument is of the type of any of the type objects passed in the second argument. Thus, it works as expected with subclassing and old-style classes, all of which have the legacy type object instance
.
type()
, on the other hand, simply returns the type object of an object and comparing what it returns to another type object will only yield True
when you use the exact same type object on both sides.
By way of example, here’s what happens when subclassing dict
:
>>> foo = {}
>>> type(foo)
<type 'dict'>
>>> class MyDict(dict):
... pass
>>> bar = MyDict()
>>> type(bar)
<class '__main__.MyDict'>
>>> type(bar) == dict
False # Unexpected result
>>> isinstance(bar, dict)
True # Expected result
As you can see, isinstance()
gives the result you’re more likely to want.
-
Though use of
isinstance()
is typically a marker of a flawed design and itself ought to be avoided if possible. ↩