1
resposta

Duvida na solução do desafio de conversão de moedas

Consegui aplicar ao projeto principal, mas gostaria de saber o motivo do pycharm apontar:Erro que o pycharm aponta na minha DEF para converter

Após sanar essa duvida também gostaria de saber se fiz corretamente e como posso melhorar, acho que também estou com dificuldades de entender quando devo utilizar o return, alguem pode me ajudar?

import re

class ExtratorURL:
    def __init__(self, url):
        self.url = self.sanitiza_url(url)
        self.valida_url()

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

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

    padrao_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/cambio')
    match = padrao_url.match(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, 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)
    if indice_e_comercial == -1:
        valor = self.get_url_parametros()[indice_valor:]
    else:
        valor = self.get_url_parametros()[indice_valor:indice_e_comercial]
    return valor

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

def __str__(self):
    return self.url + "\n" + "Parâmetros: " + self.get_url_parametros() + "\n" + "URL Base: " + self.get_url_base()

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

def teste_moeda(self):
    if moeda_origem == 'real' and moeda_destino == 'dolar':
        conversao = int(quantidade) * valor_dolar
        print(f'O valor do dolar convertido em real é {conversao}')
        return conversao
    elif moeda_origem == "dolar" and moeda_destino == "real":
        conversao = int(quantidade) // valor_dolar
        print(f'O valor do real convertido em dolar é {conversao}')
        return conversao

    else:
        return ValueError('Os parâmetros passados podem não corresponder com o esperado pelo programa')

url = "bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar"
extrator_url = ExtratorURL(url)

moeda_origem = extrator_url.get_valor_parametro("moedaOrigem")
moeda_destino = extrator_url.get_valor_parametro("moedaDestino")
quantidade = extrator_url.get_valor_parametro("quantidade")
valor_dolar = 5.50
ExtratorURL.teste_moeda(valor_dolar)
1 resposta

Olá, Gabriel. Tudo bem?

Parabéns pela implementação do desafio! É muito importante colocarmos em prática o que aprendemos. Agradeço por compartilhar seu desenvolvimento conosco.

Esse aviso que aparece no seu PyCharm que diz PEP 8: E302 expected 2 blank lines, found 1, traduzido significa PEP 8: E302 eram esperadas 2 linhas em branco, foram encontradas 1. O PEP 8 é um guia de estilo que fornece diretrizes e práticas recomendadas para escrever códigos em Python, assim os códigos seguem um padrão que melhora sua legibilidade e a consistência.

O aviso que você recebeu aparece porque para seguir as regras do PEP 8, você precisa pular duas linhas entre o import re e class ExtratorURL:. Ficando assim esse trecho de código:

import re


class ExtratorURL:
    ...

Sempre que você receber um aviso no PyCharm referente a algo do PEP 8, basta clicar em Reformat the file logo abaixo do aviso para que seja corrigido automaticamente.

Caso queira se aprofundar no assunto, deixo como recomendação um curso aqui da Alura sobre PEP 8. Assim você poderá aprender mais sobre boas práticas de programação em seus códigos Python:

Segue também os links para a documentação do PEP 8:

Sobre o uso do return, ele serve para encerrar a execução de uma função e retornar algum valor dela. Você vai usá-lo sempre que precisar utilizar um valor ou resultado de alguma função em outra parte do código.

Tendo em vista o objetivo do uso do return, uma melhoria que poderia ser feita no seu código está na função teste_moeda. Como ela já exibe o valor convertido na tela, por meio da função print, o uso do return nas linhas 56 e 60 não é necessário. Ficaria algo parecido com o trecho de código a seguir:

def teste_moeda(self):
    if moeda_origem == 'real' and moeda_destino == 'dolar':
        conversao = int(quantidade) * valor_dolar
        print(f'O valor do dolar convertido em real é {conversao}')
    elif moeda_origem == "dolar" and moeda_destino == "real":
        conversao = int(quantidade) // valor_dolar
        print(f'O valor do real convertido em dolar é {conversao}')
    else:
        return ValueError('Os parâmetros passados podem não corresponder com o esperado pelo programa')

Outra opção, caso prefira utilizar o return nessa função, seria fazer com que o print viesse fora da função teste_moeda, utilizando o valor retornado por ela. O código ficaria semelhante ao apresentado a seguir:

A implementação da função seria:

def teste_moeda(self):
    if moeda_origem == 'real' and moeda_destino == 'dolar':
        conversao = int(quantidade) * valor_dolar
        return conversao
    elif moeda_origem == "dolar" and moeda_destino == "real":
        conversao = int(quantidade) // valor_dolar
        return conversao
    else:
        return ValueError('Os parâmetros passados podem não corresponder com o esperado pelo programa')

E fora da classe, no lugar da última linha do seu código teríamos:

valor_convertido = ExtratorURL.teste_moeda()
print(f'O valor do real convertido em dolar é {valor_convertido}')

Assim, a variável valor_convertido recebe o valor retornado pela função teste_moeda que está armazenado na variável conversao e utilizamos esse valor para printar o valor convertido na próxima linha de código.

Espero ter ajudado. Qualquer outra dúvida estou a disposição.

Abraços. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!