如果我有一个清单
L = range(10)
我可以使用
将其匹配为列表isinstance(L, list)
但是,如果我要枚举它
M = enumerate(L)
它现在变成了一个枚举对象,它与列表不匹配,枚举不是我可以使用isinstance匹配的标准python对象。
匹配枚举对象的最优雅方法是什么?
答案 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
,元组和任何可迭代的自定义对象