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

у меня есть строка, которая тянет переменные из нескольких списков, и я хочу, чтобы она избегала ошибки StopIteration, которая появляется, чтобы она могла перейти на следующую строку. На данный момент я использую функцию break, это позволяет избежать остановки, но дает мне только первый элемент в списке, и он оставляет пустую строку после него, если я должен был распечатать его.

вот две из моих итераций, которые имеют ту же проблему.

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

1 ответов


в compose_line5, вместо pointer_list.next (), use item - вы уже перебираете pointer_list.

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

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

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

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