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


86

我该怎么做:

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功能是什么呢?


如果它像数字一样增加,像数字一样减去,像数字一样乘法...为什么要知道它是否是数字?有关更多详细信息,请参见鸭的打字
Makoto 2015年

我的特定用例是具有一个返回一个(一个函数返回(一个number或它返回一个sympy表达式)的函数)的函数。我想检查一下我生成的函数是否将其传递给其他函数时应做的事情。
D Adams

您的函数为什么不返回同类的东西?那就是这里的味道;您可以通过鸭类输入快速而轻松地进行输入,但是返回的内容应该保持一致。
Makoto 2015年

我想我总是可以返回一个sympy表达式,该表达式有时会计算为数字,有时会在其中保留变量。
D Adams

这就是我在想您要在这里做的事情;而不是返回多种不同的类型,而是返回一种类型,如果需要,可以将其减少为一个数字。
Makoto

Answers:


190

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

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

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

isinstance()文档中

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

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


很有帮助,谢谢!
Yaakov Bressler

11

您已经非常接近问题的标题了。您可以使用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不是类(类型对象),则它可能是类型对象的元组,或者可能递归包含其他此类元组(不接受其他序列类型)。如果classinfo不是类型或此类的元组,则引发TypeError异常。

这意味着更好的方法是

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

2
对我而言isinstance,仅重复classinfo更改就显得不太Python风格。
Makoto 2015年

1
尝试 var.__class__。那是你要的吗?@Makoto:我同意。根本不是Pythonic!
佛朗明哥

@Makoto是的 但这是D Adams可以通过在文档中搜索“ any”轻松找到的。我已经将答案扩展到了更好的版本……但是显然Martijn Pieters更快了……再次。
马丁·托马

3
any()与列表是..毫无意义。如果必须使用any(),请使用生成器表达式,至少可以从提前退出中受益。
马丁·彼得斯

我认为isinstance元组是要走的路。我只想提及解决方案,any因为这似乎是他在标题中要求的。
马丁·托马

4

这将解决您的问题:

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

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

如果您尝试进行更复杂的验证(这只是一部分),则可能还会考虑使用妖怪的方法


isinstance()已提供此功能,将具有所有必需类型的元组作为第二个参数进行检查
RFV

@ RFV5s是的。...这就是我在此处提供的示例。你有什么反对意见?
纳撒尼尔·福特

1

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

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

7
这太过分了;isinstance()不使用即可提供开箱即用的功能any()
马丁·皮特斯

@MartijnPieters我没有意识到isinstance可以采用多种类型,但是我觉得答案仍然是一个很好的答案,因为问题可以更广泛地理解为“如何检查特定函数的任何返回值”具有不同的参数是正确的”
乍得S.15年

是否应使用isinstance()无关紧要。
RFV

@乍得 我想问你为什么你认为他不应该使用isinstance()?谢谢。
签名

因为python避开了类型检查。它带来了很多额外的代码(和CPU周期),却收效甚微。鸭子打字是首选。
乍得
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.