2

我正在使用 Python 2.6,并且很难理解为什么以下代码在它被抛出的位置抛出一个 IndexError。当将此版本的 Porter Stemmer 合并到 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”语句之一会引发 IndexError。例如:

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

我无法理解的是为什么对“elif”的评估会抛出 IndexError 而不是最初的“if”语句?我还没有关于什么输入引发错误的数据(同样,这种情况非常罕见)。词干分析器也有可能收到某种类型的“坏”输入......关于 Python if-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 回答