izip_longest in itertools: como funciona o indexError de eliminação dentro do iterador?

Dentroest question @lazyr pergunta como o seguinte código deizip_longest iterador deaqu trabalho

def izip_longest_from_docs(*args, **kwds):
    # izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
    fillvalue = kwds.get('fillvalue')
    def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
        yield counter()         # yields the fillvalue, or raises IndexError
    fillers = repeat(fillvalue)
    iters = [chain(it, sentinel(), fillers) for it in args]
    try:
        for tup in izip(*iters):
            yield tup
    except IndexError:
        pass

Quando eu estava tentando entender como funciona, me deparei com a pergunta: "E se oIndexError é gerado dentro de um dos iteradores enviados paraizip_longest como parâmetros? ".

Em seguida, escrevi um código de teste:

from itertools import izip_longest, repeat, chain, izip

def izip_longest_from_docs(*args, **kwds):
    # The code is exactly the same as shown above
    ....

def gen1():
    for i in range(5):
        yield i

def gen2():
    for i in range(10):
        if i==8:
            raise IndexError #simulation IndexError raised inside the iterator
        yield i

for i in izip_longest_from_docs(gen1(),gen2(), fillvalue = '-'):
    print('{i[0]} {i[1]}'.format(**locals()))

print('\n')

for i in izip_longest(gen1(),gen2(), fillvalue = '-'):
    print('{i[0]} {i[1]}'.format(**locals()))

E aconteceu que a função emitertools module eizip_longest_from_docs trabalhe de forma diferente.

A saída do código acima:

>>> 
0 0
1 1
2 2
3 3
4 4
- 5
- 6
- 7


0 0
1 1
2 2
3 3
4 4
- 5
- 6
- 7

Traceback (most recent call last):
  File "C:/..., line 31, in <module>
    for i in izip_longest(gen1(),gen2(), fillvalue = '-'):
  File "C:/... test_IndexError_inside iterator.py", line 23, in gen2
    raise IndexError
IndexError

Então, é claramente visto que o código deizip_longes a partir deitertools propagouIndexError exceção (como eu acho que deveria), masizip_longes_from_docs 'engolido'IndexError exceção, pois foi considerado um sinal desentinel para parar de iterar.

Minha pergunta é: como eles trabalharam em torno deIndexError propagação no código noitertools module?

questionAnswers(1)

yourAnswerToTheQuestion