snippetpythonCriticalCanonical
Python: how to determine if an object is iterable?
Viewed 0 times
objecthowiterabledeterminepython
Problem
Is there a method like
but I am not sure how foolproof this is.
isiterable? The only solution I have found so far is to call:hasattr(myObj, '__iter__')
but I am not sure how foolproof this is.
Solution
-
Checking for
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.
...
-
The
However, this does not check for classes that are iterable through
Checking for
__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')The
iter built-in checks for the __iter__ method or in the case of strings the __getitem__ method.-
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')-
The
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 iterableHowever, this does not check for classes that are iterable through
__getitem__.Code Snippets
try:
some_object_iterator = iter(some_object)
except TypeError as te:
print(some_object, 'is not iterable')try:
_ = (e for e in my_object)
except TypeError:
print(my_object, 'is not iterable')from collections.abc import Iterable
if isinstance(e, Iterable):
# e is iterableContext
Stack Overflow Q#1952464, score: 1085
Revisions (0)
No revisions yet.