Python 检查变量是否是 list 中任何类型的实例

如何简洁地执行以下操作:

var = 7.0
var_is_good = (
isinstance(var, classinfo1) or
isinstance(var, classinfo2) or
isinstance(var, classinfo3)
)
80077 次浏览

你已经很接近问题的题目了,你可以使用 any和一个列表:

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

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

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

这意味着更好的方法是

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

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

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)

基于 文件,有很多方法可以将类型的值传递给 isinstance

如果您试图对 性感进行更复杂的验证(这只是其中的一部分) ,那么您也可以查看 性感(这个名字很不幸)。

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

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

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

来自 isinstance()文档:

如果 Classinfo既不是类对象也不是类型对象,则为 它可以是类或类型对象的元组,也可以递归地包含其他类似的元组(不接受其他序列类型)。

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

在 Python 3.10中,你可以使用新的 新型联合运算符,例如:

isinstance(var, classinfo1 | classinfo2)

详情请参阅 PEP 604