Is there a method like
isiterable? The only solution I have found so far is to call
But I am not sure how fool-proof this is.
__iter__ works on sequence types, but it would fail on e.g. strings in Python 2. I would like to know the right answer too, until then, here is one possibility (which would work on strings, too):
try: some_object_iterator = iter(some_object) except TypeError as te: print some_object, 'is not iterable'
iter built-in checks for the
__iter__ method or in the case of strings the
Another general pythonic approach is to assume an iterable, then fail gracefully if it does not work on the given object. The Python glossary:
Pythonic programming style that determines an object's type by inspection of its method or attribute signature rather than by explicit relationship to some type object ("If it looks like a duck and quacks like a duck, it must be a duck.") By emphasizing interfaces rather than specific types, well-designed code improves its flexibility by allowing polymorphic substitution. Duck-typing avoids tests using type() or isinstance(). Instead, it typically employs the EAFP (Easier to Ask Forgiveness than Permission) style of programming.
try: _ = (e for e in my_object) except TypeError: print my_object, 'is not iterable'
collections module provides some abstract base classes, which allow to ask classes or instances if they provide particular functionality, for example:
from collections.abc import Iterable if isinstance(e, Iterable): # e is iterable
However, this does not check for classes that are iterable through
try: iterator = iter(theElement) except TypeError: # not iterable else: # iterable # for obj in iterator: # pass
Use the Abstract Base Classes. They need at least Python 2.6 and work only for new-style classes.
from collections.abc import Iterable # import directly from collections for Python < 3.3 if isinstance(theElement, Iterable): # iterable else: # not iterable
iter() is a bit more reliable as described by the documentation:
isinstance(obj, Iterable)detects classes that are registered as Iterable or that have an
__iter__()method, but it does not detect classes that iterate with the
__getitem__()method. The only reliable way to determine whether an object is iterable is to call