如何简洁地执行以下操作:
var = 7.0 var_is_good = ( isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) )
你已经很接近问题的题目了,你可以使用 any和一个列表:
any
var = 7.0 var_is_good = any([isinstance(var, classinfo1), isinstance(var, classinfo2), isinstance(var, classinfo3), ... isinstance(var, classinfoN)])
但是看看 isinstance的文档就会发现:
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()
isinstance(var, (classinfo1, classinfo2, classinfo3))
换句话说,isinstance() 已经提供了这种开箱即用的功能。
来自 isinstance()文档:
如果 Classinfo既不是类对象也不是类型对象,则为 它可以是类或类型对象的元组,也可以递归地包含其他类似的元组(不接受其他序列类型)。
强调我的; 注意递归性质; (classinfo1, (classinfo2, classinfo3))也是一个有效的选项。
(classinfo1, (classinfo2, classinfo3))
在 Python 3.10中,你可以使用新的 新型联合运算符,例如:
isinstance(var, classinfo1 | classinfo2)
详情请参阅 PEP 604。