如何在Python中检查对象是否可迭代?

33
如何检查Python对象是否支持迭代,即可迭代对象(参见定义)?
理想情况下,我想要一个类似于isinstance(p_object, type)的函数,返回True或False,名为isiterable(p_object)
3个回答

88

您可以使用isinstancecollections.Iterable来检查这一点。

>>> from collections.abc import Iterable # for python >= 3.6
>>> l = [1, 2, 3, 4]
>>> isinstance(l, Iterable)
True

注意:自 Python 3.3 起,使用“collections”而非“collections.abc”中的 ABCs 已被弃用,并且在 3.9 中将停止工作。


1
这仅适用于新式类,并需要Python 2.6+。 - Sam Kauffman
6
请注意,str 也是可迭代的。因此,如果您考虑的是 tuple、list、set,最好只检查这三种类型。 - Shaun
使用 from collections.abc import Iterable 导入 ABCs 已经自 Python 3.3 起被弃用。 - Tomas P

10

尝试这段代码

def isiterable(p_object):
    try:
        it = iter(p_object)
    except TypeError: 
        return False
    return True

4
您不需要“检查”,而是需要做出假设。
try:
   for var in some_possibly_iterable_object:
       # the real work.
except TypeError:
   # some_possibly_iterable_object was not actually iterable
   # some other real work for non-iterable objects.

冒昧行事比征得许可更容易。


如果某个可迭代对象没有任何条目,这段代码会出问题吗?例如,如果你想区分一个列表和一个字符串,仅仅因为列表是空的就把它当作字符串来处理似乎并不是一个明智的选择。 - E. T.
2
我不同意这个观点。你可能想要使用 if not iterable: [obj] 来断言某些东西始终是可迭代的。在我看来,这样更有可能使代码更清晰。 - Will S
8
在“真正的工作”中捕获任何TypeError,但无法区分两者之间的差别。 - Robert Siemer
@WillS 当然,我也是这样做的。这样可以创建允许参数为单个对象或一堆对象的函数。 - Guimoute
1
一般认为,在非异常(预期)情况下不应使用异常。因此,对于像一个接受可能是单个值或值集合的参数的函数而言,isinstance(x, Iterable) 从这个角度来看会更好。(但在 Python 中,如果您将字符串和字节串视为“单个”值,则必须小心处理。) - cjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接