2

ユーザーが提供したベクトルインデックスをチェックするためのpythonicの方法は何ですか?

def get_value(vector, index):
    try:
        return vector[index]
    except IndexError:
        raise ValueError('bad index')

また

def get_value(vector, index):
   if -1 < index < len(vector):
       return vector[index]
   else:
       raise ValueError('bad index')
4

3 に答える 3

2

最初に試すことは、より Pythonic です。用語集から:

EAFP

許可よりも許しを求める方が簡単です。この一般的な Python コーディング スタイルは、有効なキーまたは属性が存在することを前提としており、その前提が偽であることが判明した場合に例外をキャッチします。このクリーンで高速なスタイルの特徴は、多くの try ステートメントと except ステートメントが存在することです。この手法は、C などの他の多くの言語に共通する LBYL スタイルとは対照的です。

try私はそれを...の周りに置くことさえしませんがexcept、あなたはIndexErrorを投げているだけなので、それはすでに行っています。

于 2012-08-23T16:56:12.123 に答える
1

IndexErrorユーザーに伝播させるのは合理的だと思います。indexユーザーはあなたを何かに渡しています。範囲外の場合IndexErrorは、インターフェイスから合理的にスローされます。だから私はただやります:

def get_value(vector, index):
    """ gets value... throws IndexError() if index out of range"""
    return vector[index]

これにより、インターフェイスで有効な負のインデックスを使用することもできます。

于 2012-08-23T16:54:20.090 に答える
0

1 つの方法は、IndexErrorスローされるようにすることです。これは無効な要求です。もう 1 つはvector.get(index)、失敗時に None 型を返す do です ( と同じtry: return vector[index] except: return None)。それは、失敗したときに何をするつもりであるかに大きく依存します。ユーザーに再試行を要求する場合は、おそらく .get() または try except が最適です。それ以外の場合、例外を最上位まで上げることは、プログラムが要求を処理できないことを示します。

「Pythonic」の方法は通常、例外を除いて試行されることに注意してください-ただし、ユースケースに大きく依存することを繰り返します。

于 2012-08-23T16:56:59.827 に答える