3
respostas

Não entendi esse laço while com __next__()

Estou com dificuldade pra entender essa parte do código do artigo: https://www.alura.com.br/artigos/o-que-sao-iteradores-no-python

class IteradorHttp():
    def __init__(self):
        self.registro = open(‘acessos.log’, ‘r’)
        self.linha_atual = ''

    def __iter__(self):
        return self

    def __next__(self):
        self.linha_atual = self.registro.readline()
        while self.linha_atual and not self.linha_atual.startswith(‘http://’):
            self.linha_atual = self.registro.readline()
        if self.linha_atual:
            return self.linha_atual
        raise StopIteration

iterador = IteradorHttp()

for url in iterador:
    print(url)

A minha dúvida está a partir do laço while não estou conseguindo compreender esse laço, o que ele quer dizer:

"se a linha atual e ela não começar com 'http://'"?

Se alguem puder traduzir pro português o que o código quer dizer a partir do laço, ficarei agradecido haha.

Outra dúvida é pq o if não tem uma codição, só o "if self.linha_atual". Ele quer verificar se retorna True? Se é uma linha com algo pra ser impresso?

3 respostas

Boa tarde Marcos, o que o código está fazendo é ler linha a linha o arquivo e o objetivo é identificar as urls que começam com http:// que no caso da empresa seriam endereços inseguros que os funcionários estariam acessando.

while self.linha_atual and not self.linha_atual.startswith(‘http://’):

Então o self.linha_atual vai retornar False quando chegar o fim do arquivo e não tiver mais linhas a serem lidas. E self.linha_atual.startswith(‘http://’) testa justamente se a url começa com http://.

Espero ter ajudado!

Sobre essa sua explicação "Então o self.linha_atual vai retornar False quando chegar o fim do arquivo e não tiver mais linhas a serem lidas. E self.linha_atual.startswith(‘http://’) testa justamente se a url começa com http://", tenho uma dúvida:

Ainda não consigo entender pq o self.linha_atual vai retornar False, porque do jeito que eu tava pensando, como self.linha_atual = self.registro.readline(), ele ja não leria a primeira linha do arquivo? Ele não deveria retornar True por isso?

Desculpe as perguntas muito básicas. E que eu realmente não consegui compreender o porquê ele estar retornando False

Boa noite Marcos, existem valores no python que são avaliados como False. Aqui tem uma lista deles mas posso me esquecer de algum:

  • '' - string vazia
  • 0 - inteiro zero
  • False - booleano False
  • [] - lista vazia
  • () - tupla vazia
  • {} - dicionário vazio
  • None - objeto do tipo NoneType

Então, por exemplo, quando chega o fim do arquivo, o valor armazenado em self.linha_atual vai ser uma string vazia, portanto, o if vai avaliar como False.

Abraço!