Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Faz sentido criar uma nova classe somente com a responsabilidade de conversão no desafio? Adicionalmente, a minha solução está boa?

import re

class ExtraiUrl:
    def __init__(self, url):
        self.url = self.limpa_url(url)
        self.valida_url()

    def limpa_url(self, url):
        if type(url) == str:
            return url.strip()
        else:
            return ""

    def valida_url(self):
        if not self.url:
            raise ValueError("A url está vazia")

        padrao_url = re.compile("(http(s)?://)?(www.)?(bytebank.com)(.br)?(/cambio)")
        match = padrao_url.match(self.url)

        if not match:
            raise ValueError("A url não é válida.")

    def get_url_base(self):
        indice_interrogacao = self.url.find("?")
        url_base = self.url[:indice_interrogacao]
        return url_base

    def get_url_parametros(self):
        indice_interrogacao = self.url.find("?")
        url_parametros = self.url[indice_interrogacao+1:]
        return url_parametros

    def get_valor_parametro(self, nome_parametro):
        indice_parametro = self.get_url_parametros().find(nome_parametro)
        tamanho_parametro = len(nome_parametro)
        indice_valor_parametro = indice_parametro + tamanho_parametro + 1
        indice_e_comercial = self.get_url_parametros(). find("&", indice_valor_parametro)

        if indice_e_comercial == -1:
            valor_parametro = self.get_url_parametros()[indice_valor_parametro:]
        else:
            valor_parametro = self.get_url_parametros()[indice_valor_parametro:indice_e_comercial]

        return valor_parametro

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

    def __str__(self):
        return self.url

    def __eq__(self, other):
        return self.url == other.url

class ConverteMoeda:
    def __init__(self):
        self.moeda_origem = extrator_url.get_valor_parametro("moedaOrigem")
        self.moeda_destino = extrator_url.get_valor_parametro("moedaDestino")
        self.moeda_quantidade = float(extrator_url.get_valor_parametro("quantidade"))
        self.cotacao = 5.50

    def converte_moeda(self):
        if self.moeda_origem == "real":
            valor_convertido = self.moeda_quantidade * self.cotacao
            return "O Valor de R$ " + "%.2f" % self.moeda_quantidade + " é igual a US$ " + "%.2f" % valor_convertido
        elif self.moeda_origem == "dolar":
            valor_convertido = self.moeda_quantidade / self.cotacao
            return "O Valor de US$ " + "%.2f" % self.moeda_quantidade + " é igual a R$ " + "%.2f" % valor_convertido
        else:
            return "Câmbio de " + self.moeda_origem + " para " + self.moeda_destino + " não está disponível."

    def __str__(self):
        return self.converte_moeda()

extrator_url = ExtraiUrl("https://bytebank.com/cambio?moedaOrigem=real&moedaDestino=dolar&quantidade=100")
valor_convertido = ConverteMoeda()
print(f"URL: {extrator_url}\nBase: {extrator_url.get_url_base()}\nParâmetros: {extrator_url.get_url_parametros()}")
print(valor_convertido)
1 resposta
solução!

Olá Felipe, tudo bem? Faz sentido deixar a lógica em uma classe separada sim, gostei da sua solução