I found this 3 ways to check it, but I don't know which of them is the best:
x = ['Bla', 'Bla', 'Bla', 'etc']
if isinstance(a, list): print('Perfect!')
if type(a) is list: print('Incredible!')
if type(a) == type([]): print('Awesome!')
Which of these is better?
Also, Can I use these ways to check whether an x is a string, tuple, dictionary, int, float, etc? If this is possible, in the first two methods do I have to convert a list to a tuple, string, dictionary, int, float, etc (no?), but in the third? I have to use (), {}, '', and what more for int and float?
These all express different things, so really it depends on exactly what you wish to achieve:
isinstance(x, list)
check if the type of x
is either list
or has list
as a parent class (lets ignore ABCs for simplicity etc);type(x) is list
checks if the type of x
is precisely list
;type(x) == list
checks for equality of types, which is not the same as being identical types as the metaclass could conceivably override __eq__
So in order they express the following:
isinstance(x, list)
: is x
like a list
type(x) is list
: is x
precisely a list
and not a sub classtype(x) == list
: is x
a list, or some other type using metaclass magic to masquerade as a list
.Do you need to know if it's a list, or just if it's iterable (if you can use it in a for loop, for example)? Generally the "Pythonic way" is to just go ahead and do it in a try-except, because many things can be iterable: strings, lists, sets, deques, custom types, etc. (All it takes is an __iter__
or __getitem__
method)
If you REALLY need to know what type it is, isinstance() is typically the way to go since it will also cover subclasses.
As far as using type() == something
is concerned, int
, float
, list
, etc are all types: type(1) == int
is True
.
My typical approach, where I might have a string, a list (or tuple, etc.) of strings, or an int or other object which can be converted to a string, would be this (for Python 2 - Py3 no longer has basestring
so you'll need to check for str
and/or bytes
), assuming foo
is your variable:
if isinstance(foo, basestring):
foo = (foo,) # turn it into an iterable (tuple)
# or, doStuff(foo) followed by a return or break
try:
for x in foo:
doStuff(str(x)) # do something with each element
except TypeError: # TypeError: 'some' object is not iterable
doStuff(str(foo))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With