1. ホーム
  2. python

[解決済み] Pythonで、あるオブジェクトが反復可能かどうかを判断するにはどうしたらいいですか?

2022-02-09 22:24:49

質問

のようなメソッドはありますか? isiterable ? 今のところ、私が見つけた唯一の解決法は

hasattr(myObj, '__iter__')

でも、これがどれだけフールプルーフなのかはわかりません。

解決方法は?

  1. を確認する __iter__ はシーケンス型では動作しますが、文字列などでは失敗します。 Python 2では . 私も正しい答えを知りたいのですが、それまでは、ここに1つの可能性があります(文字列でも動作するでしょう)。

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

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

  2. もうひとつの一般的な Pythonic なアプローチは、反復可能なオブジェクトを想定し、それが与えられたオブジェクトで動作しない場合は優雅に失敗することです。Pythonの用語集を参照してください。

    <ブロッククオート

    Pythonicなプログラミングスタイルで、オブジェクトの型を、ある型オブジェクトとの明示的な関係ではなく、そのメソッドや属性のシグネチャの検査によって決定する("If it looks like a type object. ダック のように鳴き ダック でなければならない。 ダック .") 特定の型よりもインターフェイスを重視することで、多相代入を可能にし、優れた設計のコードはその柔軟性を向上させます。Duck-typingはtype()やisinstance()を使ったテストを回避することができます。 その代わり、EAFP(Easier to Ask Forgiveness than Permission)スタイルのプログラミングを採用するのが一般的である。

    ...

    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__ .