繁体   English   中英

Python 检查列表中的 isinstance 是否为任何类型?

[英]Python check if isinstance any type in list?

我如何pythonicly做:

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

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

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

那么isinstanceofany函数是什么?

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

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

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

isinstance()文档

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

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

你已经很接近你的问题的标题了。 您可以使用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))

这将解决您的问题:

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

根据文档,有很多方法可以将类型的值传递给isinstance

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

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

isinstance(var, classinfo1 | classinfo2)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM