Python:“ifif”之前是否可以评估“elif”?

时间:2012-09-14 20:38:07

标签: python if-statement python-2.6

我正在使用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的修改版本,但我不认为这与我的问题相关。

1 个答案:

答案 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': ...