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

Resolvi ao criar uma nova classe

Para fazer esse desafio, eu criei uma nova classe. É um jeito "pythônico" de fazer? Eu fiz da maneira que um programador profissional resolveria o problema? Criei if self.moeda_destino == "dolar" fingindo que havia outras moedas para fazer conversão no programa e para dar utilidade na leitura da moeda de destino.

import re


class ExtratorURL:
    def __init__(self, url):
        self.url: str = url
        self.valida_url()
        # A validação da URL ocorre logo com a chamada da classe.
        self.indice_interrogacao: int = url.find('?')

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

    def __str__(self):
        return self.url

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

    def sanitiza_url(self, url):
        """Retorna a url removendo espaços em branco."""
        return url.split()

    def valida_url(self):
        """Valida se a url está vazia"""
        if not self.url:
            # Mais pythônico do que escrever self.url == "". Se self.url for uma string vazia "" ou None,
            # sairá o valor False, que, combinado com o not do condicional, permitirá o raise abaixo.
            raise ValueError("A URL está vazia.")

        padrao = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/cambio')
        match = padrao.match(self.url)
        if not match:
            raise ValueError("A URL não é válida. ")

    def get_url_base(self):
        """Retorna a base da url."""
        url_base = self.url[:self.indice_interrogacao]
        return url_base

    def get_url_parametros(self):
        """Retorna os parâmetros da url."""
        url_parametros = self.url[self.indice_interrogacao + 1:]
        return url_parametros

    def get_valor_parametro(self, parametro_busca):
        """Retorna o valor do parametro `parametro_busca`."""
        indice_parametro = self.get_url_parametros().find(parametro_busca)
        indice_valor = indice_parametro + len(parametro_busca) + 1
        indice_e_comercial = self.get_url_parametros().find('&', indice_valor)
        # Começar a procurar '&' a partir de indice_valor.
        if indice_e_comercial == -1:  # Caso o método .find não encontre o valor procurado.
            valor = self.get_url_parametros()[indice_valor:]
        else:
            valor = self.get_url_parametros()[indice_valor:indice_e_comercial]
        return valor


class Conversao:
    def __init__(self, quantidade, moeda_destino):
        self.quantidade = int(quantidade)
        self.moeda_destino = moeda_destino

    def moeda_para_moeda(self):
        if self.moeda_destino == "dolar":
            valor_da_conversao = 5.5
        conversao = self.quantidade * valor_da_conversao
        return conversao


url = "bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar"
extrator_url = ExtratorURL(url)
valor_quantidade = extrator_url.get_valor_parametro("quantidade")
print("Valor do parâmetro 'quantidade': ", valor_quantidade)

valor_moeda_origem = extrator_url.get_valor_parametro("moedaOrigem")
print("Valor do parâmetro 'moedaOrigem': ", valor_moeda_origem)

valor_moeda_destino = extrator_url.get_valor_parametro("moedaDestino")
print("Valor do parâmetro 'moedaDestino': ", valor_moeda_destino)

convertendo = Conversao(valor_quantidade, valor_moeda_destino)
print(convertendo.moeda_para_moeda())
1 resposta
solução!

Olá Akhenaton, tudo bem?

Meus parabéns pela implementação do código, fico feliz que tenha compartilhado com a comunidade do fórum Alura.

Na programação orientada a objeto (OO) um dos pontos proposto é que cada classe deve possuir uma responsabilidade, no seu código temos a classe ExtratorURL que será responsável por extrair os dados importantes de uma URL, e a classe Conversao que será responsável por trabalhar com esses dados realizando os cálculos, existe uma boa separação de responsabilidade das classes. Está no caminho certo da implementação dos códigos.

Quero aproveitar a oportunidade e sugerir a conversão do parâmetro quantidade do método inicializador da classe Conversao, para o tipo float no lugar da conversão para o tipo int, convertendo para o tipo 'float' caso o valor da quantidade informado na URL seja decimal o código não irá apresentar erro no momento da conversão. Ficando o códido como abaixo.

class Conversao:
    def __init__(self, quantidade, moeda_destino):
        self.quantidade = float(quantidade)
        self.moeda_dest

Lembre-se que pode contar sempre com o fórum, seja para postar seu desenvolvimento ou para tirar suas dúvidas.

Fico à disposição.

Abraços e bons estudos.