web-dev-qa-db-ja.com

何かがリストかどうかを確認する

何かがリストであるかどうかを確認する最も簡単な方法は何ですか?

メソッドdoSomethingにはパラメータabがあります。このメソッドでは、リストaをループして、何かを実行します。ループする前に、alistであることを確認する方法が必要です。これにより、エラーや、文字列を渡して各ループから文字を返すという不幸な状況を回避できます。

この質問は以前に尋ねられたに違いありません-しかし私のグーグルは私に失敗しました。乾杯。

22
Federer

より多くのユースケースを有効にし、文字列をスカラーとして扱うには、リストであるかどうかを確認せず、文字列ではないことを確認します。

if not isinstance(a, basestring):
    ...
16
Ants Aasma

タイプチェックは、コードの一般性、単純さ、および保守性を損ないます。優れた慣用的なPythonプログラムではめったに使用されません。

人々がタイプチェックをしたい主な理由は2つあります。

  1. 発信者が間違ったタイプを提供した場合にエラーを発行します。

    これはあなたの時間の価値がありません。実行している操作に互換性のないタイプをユーザーが指定した場合、互換性に達したときにエラーがすでに発生しています。これがすぐに起こらないのではないかと心配ですが、通常はそれほど時間はかからず、より堅牢で、シンプルで、効率的で、記述しやすいコードになります。

    多くの場合、人々は、ユーザーができるすべての愚かなことを捕まえることができることを期待して、これを主張します。ユーザーが恣意的に愚かなことをする気があるなら、あなたが彼を止めるためにできることは何もありません。タイプチェックは主に、置き換えられたもののドロップイン置換である独自のタイプを使用するユーザーを維持する可能性があります。または、ユーザーが関数が実際には多形である必要があることを認識し、同じ操作を受け入れることができる別の何かを提供する場合に使用します。

    たくさんの人が作ったものがたくさん収まるような大きなシステムがあったら、 zope.interface すべてが正しく適合していることをテストします。

  2. 受け取った引数のタイプに基づいてさまざまなことを行うため。

    APIに一貫性がないため、コードが悪化します。関数またはメソッドは、根本的に異なることではなく、1つのことを行う必要があります。これは、通常はサポートする価値のない機能になります。

    一般的なシナリオの1つは、fooまたはfooのリストのいずれかである引数を持つことです。よりクリーンな解決策は、単にfooのリストを受け入れることです。コードはよりシンプルで一貫性があります。 fooが1つしかないことが重要で一般的なユースケースである場合は、fooのリストを受け入れて何も失うものを呼び出す別の便利なメソッド/関数を使用することを検討できます。最初のAPIを提供することは、より複雑で一貫性が低いだけでなく、型が期待される正確な値でない場合に機能しなくなります。 in Python実際のタイプではなく、機能に基づいてオブジェクトを区別します。ほとんどの場合、リストの代わりに任意の反復可能オブジェクトまたはシーケンスを受け入れ、代わりにfooのように機能するものを受け入れる方がよいでしょう。特にfooが必要です。

お分かりのように、どちらの理由も通常の状況でタイプチェックするのに十分な説得力があるとは思いません。

10
Mike Graham

ループする前に、aがリストであることを確認する方法が欲しいのですが

関数を文書化します。

7
detly

通常、Pythonで型チェックを実行するのは適切なスタイルではないと考えられていますが、試してみてください

if isinstance(a, list):
  ...

a.__iter__が存在するかどうかも確認できると思います。)

5
kennytm