有没有像isiterable这样的方法?到目前为止,我找到的唯一解决办法就是打电话

hasattr(myObj, '__iter__')

但我不确定这是否万无一失。


当前回答

如果object是可迭代的,下面代码中的isiterable函数将返回True。如果不是iterable则返回False

def isiterable(object_):
    return hasattr(type(object_), "__iter__")

例子

fruits = ("apple", "banana", "peach")
isiterable(fruits) # returns True

num = 345
isiterable(num) # returns False

isiterable(str) # returns False because str type is type class and it's not iterable.

hello = "hello dude !"
isiterable(hello) # returns True because as you know string objects are iterable

其他回答

根据Python 2术语表,可迭代对象是

所有序列类型(如list、str和tuple)和一些非序列类型(如dict和file)以及使用__iter__()或__getitem__()方法定义的任何类的对象。可迭代对象可用于for循环和许多其他需要序列的地方(zip(), map(),…)。当一个可迭代对象作为参数传递给内置函数iter()时,它将返回该对象的迭代器。

当然,考虑到Python的一般编码风格,基于“请求原谅比请求许可更容易”这一事实。,一般的期望是使用

try:
    for i in object_in_question:
        do_something
except TypeError:
    do_something_for_non_iterable

但如果你需要显式检查它,你可以通过hasattr(object_in_question, "__iter__")或hasattr(object_in_question, "__getitem__")来测试可迭代对象。你需要检查两者,因为strs没有__iter__方法(至少在Python 2中没有,在Python 3中有),而且生成器对象没有__getitem__方法。

在我的脚本中,我经常发现定义一个可迭代函数很方便。 (现在合并了Alfe建议的简化):

import collections

def iterable(obj):
    return isinstance(obj, collections.Iterable):

因此,您可以测试任何对象是否具有非常可读的可迭代形式

if iterable(obj):
    # act on iterable
else:
    # not iterable

就像你对可调用函数所做的那样

编辑:如果你安装了numpy,你可以简单地做: 简单地说是什么

def iterable(obj):
    try: iter(obj)
    except: return False
    return True

如果没有numpy,可以简单地实现这段代码或上面的代码。

你可以检查__len__属性,而不是检查__iter__属性,它是由每个python内置可迭代对象实现的,包括字符串。

>>> hasattr(1, "__len__")
False
>>> hasattr(1.3, "__len__")
False
>>> hasattr("a", "__len__")
True
>>> hasattr([1,2,3], "__len__")
True
>>> hasattr({1,2}, "__len__")
True
>>> hasattr({"a":1}, "__len__")
True
>>> hasattr(("a", 1), "__len__")
True

由于显而易见的原因,不可迭代对象不会实现这一点。但是,它不会捕获没有实现它的用户定义迭代对象,也不会捕获生成器表达式,而iter可以处理生成器表达式。但是,这可以在一行中完成,并且为生成器添加一个简单的或表达式检查将解决这个问题。(注意,写入type(my_generator_expression) == generator会抛出NameError。请参考这个答案。)

你可以从类型中使用GeneratorType: >>>导入类型 > > >类型。GeneratorType <类“发电机”> >>> gen = (i for i in range(10)) >>> isinstance(gen, types.GeneratorType) 真正的 ——utdemir接受的回答

(这对于检查是否可以在对象上调用len非常有用。)

try:
  #treat object as iterable
except TypeError, e:
  #object is not actually iterable

不要检查你的鸭子是否真的是一只鸭子,看看它是否可迭代,就像它是可迭代的一样对待它,如果不是就抱怨。

从Python 3.5开始,你可以使用标准库中的typing模块来做类型相关的事情:

from typing import Iterable

...

if isinstance(my_item, Iterable):
    print(True)