2
respostas

Não é sempre que retorna True

Dei uma olhada nas dúvidas semelhantes, mas ainda estou com dúvidas.

No meu arquivo main py se eu "printo" a instância 2 (argumentosUrl2) antes de compará-la, eu vejo um True. Se eu comento, um False. Por quê?

main.py

from classe import ExtratorArgumentosUrl

url = "https://bytebank.com/cambio?moedaorigem=moedaDestino&moedaDestino=dolar&valor=700"

argumentosUrl = ExtratorArgumentosUrl(url)
argumentosUrl2 = ExtratorArgumentosUrl(url)

print(len(argumentosUrl))

print(argumentosUrl, id(argumentosUrl),"\n-----------------------------------")
# print(argumentosUrl2, id(argumentosUrl2))

print(argumentosUrl == argumentosUrl2)

classe.py

# -*- coding: utf-8 -*-
class ExtratorArgumentosUrl:
    def __init__(self, url):
        if self.url_eh_valida(url):
            self.url = url.lower()
        else:
            raise LookupError("URL inválida")


    def __str__(self):
        moeda_origem, moeda_destino = self.extrai_argumentos()
        valor = self.extrai_valor()
        return f'Moeda origem: {moeda_origem}\nMoeda destino: {moeda_destino}\nValor: {valor}\n'

    def __len__(self):
        return len(self.url)

    def __eq__(self,outra_instancia):
        print(self.url,"\n",outra_instancia.url) # debug
        return self.url == outra_instancia.url

    @staticmethod
    def url_eh_valida(url):

        if url and url.startswith("https://bytebank.com"):
            return True
        else:
            return False


    def extrai_argumentos(self):

        busca_moeda_origem = "moedaorigem="
        busca_moeda_destino = "moedadestino="

        indice_inicial_moeda_origem = self.encontra_indice_inicial(busca_moeda_origem)
        indice_final_moeda_origem = self.url.find("&")
        moeda_origem = self.url[indice_inicial_moeda_origem:indice_final_moeda_origem]

        if moeda_origem == "moedadestino":
            self.troca_moeda_origem()
            indice_inicial_moeda_origem = self.encontra_indice_inicial(busca_moeda_origem)
            indice_final_moeda_origem = self.url.find("&")
            moeda_origem = self.url[indice_inicial_moeda_origem:indice_final_moeda_origem]

        indice_inicial_moeda_destino = self.encontra_indice_inicial(busca_moeda_destino)
        indice_final_moeda_destino = self.url.find("&valor=")
        moeda_destino = self.url[indice_inicial_moeda_destino:indice_final_moeda_destino]

        return moeda_origem, moeda_destino


    def encontra_indice_inicial(self, moeda_buscada):

        return self.url.find(moeda_buscada) + len(moeda_buscada)


    def troca_moeda_origem(self):
        self.url = self.url.replace("moedadestino","real",1)


    def extrai_valor(self):
        busca_valor = "valor="
        indice_inicial_valor = self.encontra_indice_inicial(busca_valor)
        valor = self.url[indice_inicial_valor:]
        return valor
2 respostas

Oiii Gabriel, tudo bem?

Isso está acontecendo porque você está printando o objeto e quando você printa o objeto você está invocando o método __str__ que ao ser invocado irá alterar a url.

Logo, como a url será alterada o objeto1 não será igual ao objeto2. Porém, se você manter o segundo print, como as duas serão alteradas, serão iguais.

Veja:

  • Está printando o objeto que internamente chamará o __str__
print(argumentosUrl) 
  • Método __str__ irá alterar a url:
 def __str__(self):
        moeda_origem, moeda_destino = self.extrai_argumentos()
        valor = self.extrai_valor()
        return f'Moeda origem: {moeda_origem}\nMoeda destino: {moeda_destino}\nValor: {valor}\n'

Qualquer dúvida é só falar. Abraços e bons estudos!

Ah! É mesmo! Muito obrigado!!