2

Python 2.6を使用していますが、次のコードがスローされている場所でIndexErrorをスローしている理由を理解するのに苦労しています。このバージョンのPorterStemmerがWebサービスに組み込まれている場合、エラーは(非常にまれに)発生します。

このコードには、一連のシナリオの入力単語のインデックスをチェックする一連の「if-elif-elif-else」ステートメントが含まれています。self.kは整数値(プレースホルダー)であり、self.ends(val)は0または1のいずれかを返すことに注意してください。

if self.b[self.k - 1] == 'a':
    if self.ends("al"): pass
    else: return
elif self.b[self.k - 1] == 'c':
    if self.ends("ance"): pass
    elif self.ends("ence"): pass
    else: return

...additional "elifs" appear here, but none modify self.b or self.k ...

elif self.b[self.k - 1] == 's':
    if self.ends("ism"): pass
    else: return

ただし、まれに(入力が非常に可変である)、「elif」ステートメントの1つがIndexErrorをスローします。例えば:

line 290, in step4
elif self.b[self.k - 1] == 's':
IndexError: string index out of range

私が理解できないのは、「elif」の評価が最初の「if」ステートメントではなくIndexErrorをスローしている理由です。どの入力がエラーをスローしているかについてのデータはまだありません(繰り返しますが、発生は非常にまれです)。ステマーが何らかの「悪い」入力を受け取っている可能性もあります...Pythonif-elifsに関して私が見逃している/知っておくべきことはありますか?(「elif」を「if」の前に置くことはできないことを認識しています...)。

ありがとう、そして私が追加情報を提供できるかどうか私に知らせてください。

また、完全なコード(のほとんど)に興味がある場合は、これの修正バージョンを使用しています:http: //tartarus.org/~martin/PorterStemmer/python.txt、しかし私はこれを考えていません私の質問に関連しています。

4

1 に答える 1

3

他に誰もself.bまたはself.kを変更していない場合、それを何度もチェックすることのポイントは何ですか?最初のifの前に変数に格納し、次のように使用します。

c = self.b[self.k - 1]
if c=='a': ...
elif c=='c': ...

ここで、他の誰か別のスレッドでself.bまたはself.kを変更している場合は、最初のifの前にそれを変数に格納し、それを使用する必要があります。

c = self.b[self.k - 1]
if c=='a': ...
elif c=='c': ...
于 2012-09-14T20:42:20.247 に答える