Existe uma maneira muito Python de escrever essa expressão sem escrever explicitamente um bloco try-except para um StopIteration
:
# some_iterable is some collection that can be iterated over
# e.g., a list, sequence, dict, set, itertools.combination(...)
for value in some_iterable:
print value
Você pode ler os PEPs relevantes 234 255 se você quiser saber mais por que StopIteration
foi introduzido e a lógica por trás dos iteradores.
Um princípio geral em python é ter uma maneira de fazer algo (ver import this
) e, de preferência, seu belo, explícito, legível e simples, que o método pythonic satisfaz. Seu código equivalente é necessário apenas porque o python não fornece aos iteradores uma função hasNext
member; preferindo que as pessoas simplesmente percorram os iteradores diretamente (e se você precisar fazer outra coisa apenas para tentar lê-lo e capturar uma exceção).
Essa captura automática de uma exceção StopIteration
no final de um iterador faz sentido e é um análogo do EOFError
gerado se você ler além do final do arquivo.