1
resposta

Desafio do conversor de moedas e implementado uma função a mais

Olá! Acabei de terminar o curso de string em python, e no final, o professor pediu um desafio, para implementarmos um cálculo direto no programa. Fiz Fiz de um jeito que tinha dado erro, então basicamente ficou bem parecida a minha resolução com a do professor, com a diferença de que fiz em inglês por boa prática. Além das implementações que o professor fez, eu fiz uma que acho que ficou boa. Fiz um ValueError no código caso o usuário selecionasse a mesma moeda. Abaixo está meu código. Gostaria de saber o que posso mudar no código para ficar mais limpo, e também gostaria de saber se a implementação foi feita de modo inteligente, ou se teria um modo mais simples de fazê-la.

import re

class ExtractorURL:
    def __init__(self, url):
        self.url = self.sanitize_url(url)
        self.url_validation()

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

    def url_validation(self):
        if not self.url:
            raise ValueError('Empity URL')

        pattern_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/exchange')
        match = pattern_url.match(url)

        if not match:
            raise ValueError('THE URL IS NOT VALID.')

    def get_base_url(self):
        index_interrogation = self.url.find('?')
        url_base = self.url[:index_interrogation]
        return url_base

    def get_url_parameters(self):
        index_interrogation = self.url.find('?')
        url_parameters = self.url[index_interrogation+1:]
        return url_parameters

    def get_parameter_value(self, search_parameter):
        index_parameter = self.get_url_parameters().find(search_parameter)
        index_value = index_parameter + len(search_parameter) + 1
        index_comercial_e = self.get_url_parameters().find('&', index_value)
        if index_comercial_e == -1:
            value = self.get_url_parameters()[index_value:]
        else:
            value = self.get_url_parameters()[index_value:index_comercial_e]
        return value

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

    def __str__(self) -> str:
        return self.url + '\n' + 'Parameters: ' + self.get_url_parameters() + '\n' + 'Base URL: ' + self.get_base_url()

    def __eq__(self, __o: object) -> bool:
        return self.url == __o.url

url = 'bytebank.com/exchange?quantity=100&originCurrency=real&destinyCurrency=dolar'
url_extractor = ExtractorURL(url)
url_extractor2 = ExtractorURL(url)

dolar_value = 5.50
origin_currency = url_extractor.get_parameter_value("originCurrency")
destiny_currency = url_extractor.get_parameter_value("destinyCurrency")
quantity = url_extractor.get_parameter_value("quantity")

if origin_currency == "real" and destiny_currency == "dolar":
    conversion_value = int(quantity) / dolar_value
    print("The value of R$" + quantity + " is equal to US$" + str(conversion_value))
elif origin_currency == "dolar" and destiny_currency == "real":
    conversion_value = int(quantity) * dolar_value
    print("The value of US$" + quantity + " is equal to R$" + str(conversion_value))
elif origin_currency == destiny_currency:
    raise ValueError('Equal Currency. Please, select different currencies')
else:
    print(f"The exchange of {origin_currency} to {destiny_currency} isn't available.")


#print('The length of the URL is: ', len(url_extractor))
#print(url_extractor)

print(id(url_extractor))
print(id(url_extractor2))

#print(url_extractor == url_extractor2)

#quantity_value = url_extractor.get_parameter_value("quantity")
#print(quantity_value)
1 resposta

Olá! O código ficou perfeito, acredito que não teria como dar uma limpada no código, a não ser de criar um def e só chamar ele depois para fazer o cálculo