2013-04-02 9 views
2

У меня 2 генератора и с помощью следующего метода & во время цикла обработки через него, как показано ниже,StopIteration identfying на Iterable объекта

код

while end_of_loop = 'n': 
    try: 
     table1_row = next(table1_generator) 
     table2_row = next(table2_generator) 
    except StopIteration: 
     end_of_loop = 'y' 

Как определить, какой итератор объект не имеет ни одной строки?

Im пытается сравнить 2 таблицы и каждая строка таблицы находится в объектах генератора.

def _compare(self): 
     end_of_table = 'N' 

     try: 
      while end_of_table =='N': 
       try: 
        if self.table1_key == self.table2_key: 
         print 'same key' 
         self.table1_row = next(self.table1_generator) 
         self._convert_table1_key_fields() 
         self.table2_row = next(self.table2_generator) 
         self._convert_table2_key_fields() 
        elif self.table1_key > self.table2_key: 
         self.table2_row = next(self.table1_generator) 
         self._convert_table2_key_fields() 
        elif self.table1_key < self.table2_key: 
         self.table1_row = next(self.table2_generator) 
         self._convert_table1_key_fields() 
       except StopIteration as e: 
        print e.args 
        print 'IterError' 
        end_of_table = 'y' 

     except StopIteration: 
      print 'Next Iteration' 

ответ

1

Я не могу думать о прецеденте для этого (ухода поделиться?), Но я хотел бы попробовать обертывание next в мой собственные функции:

def mynext(it): 
    try: 
     return next(it) 
    except StopIteration: 
     raise StopIteration(it) 

, а затем, например,

a = iter([1,2,3,4,5]) 
b = iter([4,5,6,7]) 

try: 
    while True: 
     print mynext(a) 
     print mynext(b) 
except StopIteration as e: 
    if e.args[0] == a: print 'a ended' 
    if e.args[0] == b: print 'b ended' 
+0

при печати e.args его пустой .. – user1050619

+0

@ user1050619: он пуст, потому что вы используете голый 'next', а не обертку. – georg

2

Вы не предоставили сведения о контексте или то, что вы на самом деле пытаетесь сделать, но это звучит как itertools.izip_longest может быть полезными в вашем случае (и более вещими). Вы можете заполнить Nones или другое подходящее значение.

4

Вы можете предоставить второй «дозорный» значение next:

sentinel = object() 
while end_of_loop = 'n': 

    table1_row = next(table1_generator,sentinel) 
    table2_row = next(table2_generator,sentinel) 

    #I don't account for the case where they could be exhausted at 
    #the same time. It's easy to add that if it matters though. 
    if table1_row is sentinel: 
     print "table1_generator gave up first" 
     #"break" might be more appropriate ... 
     #(Unless there more to the loop than this.) 
     end_of_loop = 'y'  
    elif table2_row is sentinel: 
     print "table2_generator gave up first" 
     end_of_loop = 'y' 
Смежные вопросы