Skip to content

How to Check if an Object is Iterable in Python

Learn how to reliably determine if a Python object is iterable using iter() with a try-except block, including reusable function examples and why alternatives like collections.abc.Iterable may fail.

Determining whether an object is iterable (can be used in a loop) is a fundamental task in Python.

This guide explains the most reliable method for checking iterability using the iter() function and try-except blocks. It also discusses why alternative approaches (like checking for __iter__ or using collections.abc.Iterable) are less comprehensive.

The most reliable and Pythonic way to check if an object is iterable is to use the built-in iter() function within a try-except block:

my_str = 'hello'

try:
    my_iterator = iter(my_str)  # Attempt to get an iterator
    print('The object is iterable')
    for i in my_iterator:  # We can iterate over the object
        print(i)  # Output: h, e, l, l, o
except TypeError as te:
    print('The object is NOT iterable')
    print(te)
  • iter(my_str) attempts to get an iterator from the object.
  • If the object is not iterable, then iter() will raise a TypeError exception.
  • If the try block succeeds (no TypeError), the object is iterable.

Creating a Reusable Function

For convenience, encapsulate this logic in a reusable function:

def is_iterable(value):
    try:
        iter(value)
        return True
    except TypeError:
        return False

print(is_iterable('hello'))  # Output: True
print(is_iterable(100))      # Output: False
  • This function can be used for checking any variable if its type is iterable or not.

Why collections.abc.Iterable is Insufficient

You might encounter code that uses collections.abc.Iterable and isinstance():

from collections.abc import Iterable

my_list = ['a', 'b', 'c']
print(isinstance(my_list, Iterable))    # Output: True
print(isinstance(100, Iterable))        # Output: False

However, this approach is not comprehensive. It only checks if the object's class (or a parent class) is registered as a subclass of Iterable. It doesn't detect objects that are iterable via the __getitem__ method (the sequence protocol), which is a valid way to make an object iterable. Therefore, relying solely on isinstance(obj, Iterable) can lead to false negatives.

Most Iterable Built-in Objects Implement the __iter__ Method

Most built-in iterable objects implement the __iter__() method, making it possible to check for iterability using iter() method. Here are a few examples of Python built-in objects that implement the __iter__ method:

print({}.__iter__)
print(().__iter__)
print([].__iter__)
print(''.__iter__)
print({'a', }.__iter__)

Making a Class Iterable

To make your own classes iterable, you need to implement either __iter__() (returning an iterator) or __getitem__ (for sequence-like behavior). The more common and flexible approach is to use __iter__():

class Counter:
   def __init__(self, start, stop):
      self.current = start - 1
      self.stop = stop

   def __iter__(self):
      return self # Return iterator

   def __next__(self):
       self.current += 1
       if self.current < self.stop:
           return self.current
       raise StopIteration # Indicate the iteration is over


   for c in Counter(0, 4):
       print(c) # Output: 0, 1, 2, 3
  • This Counter class is iterable because it defines both __iter__ and __next__.
Navigation