在Python中,如何确定对象是否可迭代?


在Python中,如何确定对象是否可迭代?


方法1

检查__iter__序列类型的工作,但它会失败,例如Python 2中的字符串。我也想知道正确的答案,在此之前,这里有一种可能性(也适用于字符串):

try:
    some_object_iterator = iter(some_object)
except TypeError as te:
    print some_object, 'is not iterable'

所述iter内置的检查的__iter__方法或串的情况下的__getitem__方法。

方法2

另一种通用的pythonic方法是假设一个可迭代的,如果它不能在给定的对象上工作则优雅地失败。Python词汇表:

Pythonic编程风格,通过检查其方法或属性签名而不是通过与某个类型对象的显式关系来确定对象的类型(“如果它看起来像鸭子,像鸭子那样嘎嘎叫,它必须是鸭子。”)通过强调接口而不是特定类型,精心设计的代码通过允许多态替换来提高其灵活性。Duck-typing避免使用type()或isinstance()进行测试。相反,它通常采用EAFP(更容易要求宽恕而不是许可)的编程风格。

try:
   _ = (e for e in my_object)
except TypeError:
   print my_object, 'is not iterable'

方法3

collections模块提供了一些抽象基类,如果它们提供特定功能,它们可以询问类或实例,例如:

import collections

if isinstance(e, collections.Iterable):
    # e is iterable

但是,这不会检查可迭代的类__getitem__