Как избежать ошибки StopIteration в Python

У меня есть строка, в которую вводятся переменные из нескольких списков, и я хочу, чтобы она избегала возникающей ошибки StopIteration, чтобы она могла перейти на следующую строку. На данный момент я использую функцию прерывания, это позволяет избежать 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

Это ошибка, которую я получаю без перерыва:

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 ()?


person JohnConneely    schedule 26.06.2013    source источник
comment
Почему вы вызываете self.pointer_list.next () и передаете pointer_list?   -  person doctorlove    schedule 26.06.2013
comment
Извините, опечатка !! в любом случае без разницы!   -  person JohnConneely    schedule 26.06.2013
comment
Здесь нет необходимости что-либо ставить в тройные кавычки; вы не включаете разрывы строк, а цитирование слишком многословно. Еще лучше использовать форматирование строки: 'http://www.example.org/lexicon#{} http://www.monnetproject.eu/lemon#has_ptr{}\n'.format(synset_offset, pointer_list.next()).   -  person Martijn Pieters    schedule 26.06.2013
comment
В каждой строке должно быть два пробела, я конвертирую их в тройной формат, и он не принимает полные строки, могу ли я оставить пробелы в этом форматировании?   -  person JohnConneely    schedule 26.06.2013


Ответы (1)


В compose_line5 вместо pointer_list.next() используйте item - вы уже повторяете pointer_list.

Для compose_line6 кажется, что вы хотите перебирать два списка одновременно. Используйте главный ответ из Есть ли лучший способ перебрать два списка, получая по одному элементу из каждого списка для каждой итерации? (я предполагаю, что оба списка имеют одинаковую длину)

Да, протокол итератора вызовет StopIteration (не ошибку, просто исключение, сигнализирующее об окончании итерации), если вы вызовете .next() для него вручную. Питонический способ его использования - использовать его как обычный итератор (например, перебирать его в цикле), а не вызывать на нем .next().

В вашем коде есть еще несколько проблем, на которые вы, возможно, захотите обратить внимание - см. http://www.python.org/dev/peps/pep-0008/

Например, нет необходимости использовать '''''', когда достаточно ''. Вместо того, чтобы делать +=, вы можете создать список, а в конце присоединиться к нему. Не уверен, почему вы храните вещи в себе, если вы просто возвращаете их из функции.

person Thomas Vander Stichele    schedule 26.06.2013