6

オブジェクトが「リストっぽい」タイプではないかどうか、つまり、オブジェクトが反復可能でないかどうかをテストする方法を探しています (たとえば、文字列または単純なオブジェクトでiterを実行することもできます)。 iterを実装するオブジェクト) が、そのオブジェクトがリスト ファミリーに含まれていないこと。「 list 」ファミリーを list/tuple/set/frozenset、またはそれらから継承するものとして定義しますが、何かが欠けている可能性があるため、isinstanceすべてに対して実行するよりも一般的な方法を見つけたいと思いますそれらのタイプ。

私はそれを行うための2つの可能な方法を考えましたが、どちらも考えられるすべてのリストタイプに対して非常に多くのテストを行うため、やや厄介に思えます。私はより一般的な解決策を探しています.

最初のオプション:

return not isinstance( value, (frozenset, list, set, tuple,) )

2 番目のオプション:

return not hasattr(value, '__iter__')

__iter__属性のテストは十分ですか? オブジェクトがリスト型でないかどうかを調べるより良い方法はありますか?

前もって感謝します。

編集

( @Rosh Oxymoron のソリューションへのコメントから引用):
定義についてよりよく考えると、定義で配列型ではないすべてのものを見つける必要があると言う方が正しいと思いますが、それでも文字列/他の単純なオブジェクト...
に対してチェックすると、メソッドを実装するオブジェクトに対してTruecollections.Iterableが返されます。__iter__

4

2 に答える 2

6

「リストっぽい」という用語はなく、魔法の組み込みもありませんcheck_if_value_is_an_instance_of_some_i_dont_know_what_set_of_types

あなたの解決策not isinstance( value, (frozenset, list, set, tuple,) )はかなり良いです-それは明確で明示的です。

于 2011-08-28T14:11:12.403 に答える
3

そのようなファミリはありません。明確に定義されておらず、当然、チェックする方法もありません。可能な限り最も近いものは、文字列ではない iterable です。オブジェクトの反復可能性をテストしてから、それが文字列かどうかを明示的に確認できます。

if isinstance(ob, collections.Iterable) and not isinstance(ob, types.StringTypes):
    print "An iterable container"

より良いアプローチは、反復可能なオブジェクトを常に要求し、単一の string を渡す必要がある場合は代わりSに渡すことです。[S]文字列を渡す機能は、次のような機能です。

alphabet = set('abcdefgijklmopqrstuvwxyz')

文字列を特殊なケースにすると、次のようになります。

  1. 文字のコレクションを渡す最も自然な方法で、関数を使用する能力を壊します。
  2. ユーザー定義の文字列型および/または文字列っぽい他のコンテナ (たとえばarray.array、文字列のようにデータのチャンクを表すことができる) に対して矛盾を作成します。

文字列は、単一のテキストと文字のコレクションの両方を表すために使用できます。また、2 番目の理由から、リスト風でもあります。

于 2011-08-28T14:17:03.027 に答える