Python check if isinstance any type in list?
Solution 1:
isinstance()
takes a tuple of classes for the second argument. It'll return true if the first argument is an instance of any of the types in that sequence:
isinstance(var, (classinfo1, classinfo2, classinfo3))
In other words, isinstance()
already offers this functionality, out of the box.
From the isinstance()
documentation:
If classinfo is neither a class object nor a type object, it may be a tuple of class or type objects, or may recursively contain other such tuples (other sequence types are not accepted).
Emphasis mine; note the recursive nature; (classinfo1, (classinfo2, classinfo3))
is also a valid option.
Solution 2:
You were pretty close with the title of your question already. You could use any
and a list:
var = 7.0
var_is_good = any([isinstance(var, classinfo1),
isinstance(var, classinfo2),
isinstance(var, classinfo3), ...
isinstance(var, classinfoN)])
But looking in the docs of isinstance
reveals:
Return true if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. If object is not an object of the given type, the function always returns false. If classinfo is not a class (type object), it may be a tuple of type objects, or may recursively contain other such tuples (other sequence types are not accepted). If classinfo is not a type or tuple of types and such tuples, a TypeError exception is raised.
This means the better way to do it is
var = 7.0
var_is_good = isinstance(var, (classinfo1,
classinfo2,
classinfo3,
...,
classinfoN))
Solution 3:
From Python 3.10 you can use the new New Type Union Operator, e.g. :
isinstance(var, classinfo1 | classinfo2)
See PEP 604 for details.
Solution 4:
This will solve your problem:
valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)
Based on the documentation there are a lot of ways you can pass values of types in to isinstance
.
You might also look into voluptuous if you're trying to do a more complicated validation of which this is just a part.
Solution 5:
You generally shouldn't be using isinstance
, but what you're wanting to do can be accomplished with the any() builtin function.
var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])