Python 检查实例是否在列表中的任何类型?

Python check if isinstance any type in list?

如何紧凑地执行以下操作:

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

这行不通:

var_is_good = isinstance(var, [classinfo1, classinfo2, classinfo3])

您已经非常接近问题的标题了。您可以使用 any 和一个列表:

var = 7.0
var_is_good = any([isinstance(var, classinfo1),
                   isinstance(var, classinfo2),
                   isinstance(var, classinfo3), ...
                   isinstance(var, classinfoN)])

但是查看 isinstance 的文档会发现:

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.

这意味着更好的方法是

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

您通常不应该使用 isinstance,但您可以使用 any() 内置函数来完成您想做的事情。

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])

这将解决您的问题:

valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)

基于 documentation,您可以通过多种方式将类型的值传递给 isinstance

如果您尝试进行更复杂的验证(这只是其中的一部分),您也可以查看 voluptuous

isinstance() 元组 的 类 作为第二个参数。如果第一个参数是该序列中 any 类型的实例,它将 return 为真:

isinstance(var, (classinfo1, classinfo2, classinfo3))

换句话说,isinstance() 已经提供了这个功能,开箱即用。

来自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).

强调我的;注意递归性质; (classinfo1, (classinfo2, classinfo3)) 也是一个有效选项。

从 Python 3.10 开始,您可以使用新的 New Type Union Operator,例如:

isinstance(var, classinfo1 | classinfo2)

详情见PEP 604