我正在使用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的修改版本,但我不认为这与我的问题相关。
答案 0 :(得分: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': ...