Python: オブジェクトが反復可能かどうかを判断するには? 質問する

Python: オブジェクトが反復可能かどうかを判断するには? 質問する

のような方法はありますかisiterable? これまでに見つけた唯一の解決策は、以下を呼び出すことです:

    hasattr(myObj, '__iter__')

しかし、これがどれほど確実であるかはわかりません。

ベストアンサー1

  1. のチェックはシーケンス型では機能しますが、たとえばPython 2 の__iter__文字列では失敗します。私も正しい答えを知りたいのですが、それまでは、ここに 1 つの可能性があります (文字列でも機能します)。

    try:
        some_object_iterator = iter(some_object)
    except TypeError as te:
        print(some_object, 'is not iterable')
    

    組み込み関数iterはメソッドをチェックします。__iter__文字列の場合はメソッドをチェックします__getitem__

  2. もう 1 つの一般的な Python のアプローチは、反復可能オブジェクトを想定し、指定されたオブジェクトで動作しない場合は適切に失敗することです。Python 用語集:

    Python プログラミング スタイル。オブジェクトの型を、何らかの型オブジェクトとの明示的な関係ではなく、メソッドまたは属性シグネチャの検査によって決定します (「アヒルのように見えアヒルのように鳴くなら、それはアヒルに違いない」)。特定の型ではなくインターフェイスを強調することで、適切に設計されたコードは、ポリモーフィック置換を許可して柔軟性を向上させます。ダック タイピングでは、type() または isinstance() を使用したテストを回避します。代わりに、通常は EAFP (許可よりも許しを求めるほうが簡単) プログラミング スタイルを採用します。

    ...

    try:
       _ = (e for e in my_object)
    except TypeError:
       print(my_object, 'is not iterable')
    
  3. collectionsモジュールはいくつかの抽象基本クラスを提供します。これにより、クラスまたはインスタンスに特定の機能を提供するかどうかを問い合わせることができます。次に例を示します。

    from collections.abc import Iterable
    
    if isinstance(e, Iterable):
        # e is iterable
    

    ただし、これは を通じて反復可能なクラスはチェックしません__getitem__

おすすめ記事