在python中检测枚举对象

时间:2014-02-20 18:11:45

标签: python enumerate

如果我有一个清单

L = range(10)

我可以使用

将其匹配为列表
isinstance(L, list)

但是,如果我要枚举它

M = enumerate(L)

它现在变成了一个枚举对象,它与列表不匹配,枚举不是我可以使用isinstance匹配的标准python对象。

匹配枚举对象的最优雅方法是什么?

4 个答案:

答案 0 :(得分:2)

为什么它不是标准的python对象?您可以使用isinstance(M, enumerate)来检查:

In [128]: e
Out[128]: <enumerate at 0x6933b70>

In [129]: type(e)
Out[129]: enumerate

In [130]: isinstance(e, enumerate)
Out[130]: True

答案 1 :(得分:1)

enumerate作为isinstance的第二个参数提供应该可以正常工作:

isinstance(M, enumerate)

参见下面的演示:

>>> M = enumerate(range(10))
>>> M
<enumerate object at 0x020B7EB8>
>>> isinstance(M, enumerate)
True
>>>

以下是docs所说的*:

  

isinstance(object,classinfo)

     

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


*我添加了粗体。

答案 2 :(得分:0)

虽然我无法看到为什么你想要这样做,但你可以简单地匹配这个类型:

>>> enumerate
<type 'enumerate'>
>>> isinstance(enumerate(range(10)),enumerate)
True

答案 3 :(得分:0)

听起来你真正想要做的就是测试你是否可以使用for循环迭代你的类型。执行此操作的方法是测试名为__iter__的方法:

if hasattr(l, '__iter__'):
    # do something with the iterable

或者,您可以使用标准库:

from collections.abc import Iterable
if isinstance(l, Iterable):
    # do something with the iterable

此方法适用于列表,enumerate,元组和任何可迭代的自定义对象

相关问题