__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):
from __future__ import print_function
try: someobjectiterator = iter(someobject) except TypeError as te: print(someobject, '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'
collectionsmodule 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