Python check if isinstance any type in list?

PythonTypesIsinstance

Python Problem Overview


How do I pythonicly do:

var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or  isinstance(var, classinfoN)

It seems silly I can't just pass in a list of classinfo's:

var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )

So what is the isinstanceofany function?

Python Solutions


Solution 1 - Python

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 - Python

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 - Python

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 - Python

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 - Python

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])

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionD AdamsView Question on Stackoverflow
Solution 1 - PythonMartijn PietersView Answer on Stackoverflow
Solution 2 - PythonMartin ThomaView Answer on Stackoverflow
Solution 3 - PythonChris_RandsView Answer on Stackoverflow
Solution 4 - PythonNathaniel FordView Answer on Stackoverflow
Solution 5 - PythonChad S.View Answer on Stackoverflow