概要

Pythonでオブジェクトがイテラブル(反復可能)かどうかを確認するには、いくつかの方法があります。最も確実なのは、iter() を使ってオブジェクトがイテレーション可能かどうかを試み、失敗した場合に TypeError をキャッチする方法です。また、Pythonの抽象基底クラス(collections.abc.Iterable)を使って型チェックを行うこともできますが、これは全てのイテラブルを検出するわけではありません。

iter() を使った確認方法

iter() 関数を使うことで、オブジェクトがイテラブルかどうかを簡単に確認できます。この方法は、__iter__ メソッドを持つオブジェクトに対応し、さらに __getitem__ メソッドを持つシーケンス型(例: リストやタプル)にも対応します。例として、次のように使用します。

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

この方法は、イテラブルでないオブジェクトに対しても安全に動作し、広範囲のオブジェクトをサポートします。iter() が成功すればオブジェクトはイテラブルとみなされ、失敗すればイテラブルではないと判断できます。

collections.abc.Iterable を使った型チェック

Pythonの抽象基底クラスcollections.abc.Iterableを使って、オブジェクトがイテラブルかどうかを isinstance() 関数で確認する方法もあります。

from collections.abc import Iterable
def is_iterable(obj):
    return isinstance(obj, Iterable)

この方法は __iter__ メソッドを持つオブジェクトを確認するため、クラスベースでのチェックが可能です。しかし、__getitem__ メソッドのみを持つ古いスタイルのイテラブルオブジェクトには対応していないため、万能ではありません。

Duck TypingとEAFP

Pythonでは「Duck Typing」というプログラミングスタイルが推奨されており、これに基づいて iter() を使うアプローチが「Pythonic」な方法とされています。Duck Typingとは、オブジェクトが特定のメソッドやプロパティを持つかどうかを確認して、そのオブジェクトの型を判断する手法です。iter() を使うことで、イテラブルかどうかを確実に判断し、イテラブルでない場合にはエラーをキャッチして適切に処理できます。

結論

Pythonでオブジェクトがイテラブルかを確認するには、iter() を使う方法が最も安全で一般的です。collections.abc.Iterable を使った型チェックも可能ですが、すべてのイテラブルを網羅するわけではないため、状況に応じて使い分ける必要があります。PythonではDuck TypingとEAFP(Easier to Ask Forgiveness than Permission)のスタイルを活用することで、柔軟なコードを書くことができます。