如何避免在Python中出现StopIteration错误

17

我有一条代码行,从多个列表中提取变量,我希望它避免StopIteration错误,并继续执行下一行。目前我正在使用break函数来避免StopIteration,但这只会给我列表中的第一个项目,并且在其后留下一个空白行,如果我要打印它出来。

这里有两个具有相同问题的迭代。

def compose_line5(self, synset_offset, pointer_list):
    self.line5 = ''''''
    for item in pointer_list:
        self.line5 += '''http://www.example.org/lexicon#'''+synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+pointer_list.next()+'''\n'''            
        break
    return self.line5

def compose_line6(self, pointer_list, synset_list): 
    self.line6 = ''''''
    for item in synset_list:
        self.line6 += '''http://www.example.org/lexicon#'''+pointer_list.next()+''' http://www.monnetproject.eu/lemon#pos '''+synset_list.next()+'''\n'''                      
        break
    return self.line6

如果没有break,我就会收到这个错误:

Traceback (most recent call last):
  File "wordnet.py", line 225, in <module>
    wordnet.line_for_loop(my_file)
  File "wordnet.py", line 62, in line_for_loop
    self.compose_line5(self.synset_offset, self.pointer_list)
  File "wordnet.py", line 186, in compose_line5
    self.line5 += '''http://www.example.org/lexicon#'''+self.synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+self.pointer_list.next()+'''\n'''
StopIteration

这个问题有快速解决方法吗,还是我必须为我使用iter()的每种方法捕获异常?


1
为什么要调用self.pointer_list.next()并传入一个pointer_list? - doctorlove
抱歉,打错字了!!不过这也没有什么影响! - JohnConneely
2
这里不需要三重引号;你不需要包含换行符,而且引用过于冗长。更好的方法是使用字符串格式化:'http://www.example.org/lexicon#{} http://www.monnetproject.eu/lemon#has_ptr{}\n'.format(synset_offset, pointer_list.next()) - Martijn Pieters
每行需要两个空格,我正在将它们转换为三倍格式,但它不接受任何完整的行,那么在这种格式化中我可以保留空格吗? - JohnConneely
1个回答

14
compose_line5中,不要使用pointer_list.next(),而是使用item - 因为您已经在迭代pointer_list了。
对于compose_line6,您似乎想同时迭代两个列表。请使用这里的最佳答案(假设两个列表长度相同)。
是的,如果手动调用.next(),迭代器协议会引发StopIteration(不是错误,只是表示迭代结束的异常)。 使用它的Pythonic方式是将其用作普通迭代器(例如,循环遍历它),而不是调用.next()
您的代码存在一些问题,您可能需要查看-请查看http://www.python.org/dev/peps/pep-0008/ 例如,当''足够时,无需使用''''''。 您可以创建一个列表,然后在最后加入它们,而不是使用+=。 如果您只是从函数返回值,则不确定为什么要将值存储在self中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接