121

我该如何做:

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

我不能只传入一个类信息列表,这似乎很愚蠢:

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

那么它的isinstanceofany功能是什么?

4

5 回答 5

269

isinstance()为第二个参数接受一个类的元组。如果第一个参数是该序列中任何类型的实例,它将返回 true :

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

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

isinstance()文档中:

如果classinfo既不是类对象也不是类型对象,它可能是类或类型对象的元组,或者可能递归包含其他此类元组(不接受其他序列类型)。

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

于 2015-10-23T21:00:58.893 回答
15

你已经很接近你的问题的标题了。您可以使用any和列表:

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

但是查看文档的isinstance揭示:

如果 object 参数是 classinfo 参数或其(直接、间接或虚拟)子类的实例,则返回 true。如果 object 不是给定类型的对象,则该函数始终返回 false。如果 classinfo 不是类(类型对象),它可能是类型 objects 的元组,或者可能递归包含其他此类元组(不接受其他序列类型)。如果 classinfo 不是类型或类型的元组和此类元组,则会引发 TypeError 异常。

这意味着更好的方法是

var = 7.0
var_is_good = isinstance(var, (classinfo1,
                               classinfo2,
                               classinfo3,
                               ...,
                               classinfoN))
于 2015-10-23T20:58:31.577 回答
11

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

isinstance(var, classinfo1 | classinfo2)

有关详细信息,请参阅PEP 604

于 2021-02-26T15:42:22.783 回答
4

这将解决您的问题:

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

根据文档,您可以通过多种方式将类型的值传递给isinstance.

如果您尝试进行更复杂的验证,这只是其中的一部分,您也可能会考虑性感。

于 2015-10-23T20:59:30.090 回答
1

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

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])
于 2015-10-23T20:58:56.243 回答