Decidi fazer o código por conta com o que aprendi até aqui. Senti dificuldade em fazer as funções compartilharem seus resultados e acabei chamando as funções que geram variáveis compartilhadas no construtor e atribuindo seus returns ao self. Não sei se devo usar um @property nesse caso. Achei bagunçado mas não consegui pensar em maneira melhor de fazer. Gostaria de algumas dicas se puderem ajudar.
A minha função pede como parametros não somente a url mas também a lista de caracteres a separar. No exemplo do exercício, estes caracteres são ['?', '&', '='], por isso coloquei mais um validador. E nas funções get também temos mais duas, uma get_separador_base que retorna o indice do separador entre a base e os parametros na url. E outra get é a get_valores_e_parametros que retorna uma lista com os parametros e os valores na ordem em que aparecem na url.
class ExtratorUrl:
def __init__(self,url, lista_de_separadores):
self.separadores = lista_de_separadores
self.url = self.sanitiza_url(url)
self.valida_url()
self.valida_separadores()
self.indices_a_recortar = self.lista_a_recortar()
def sanitiza_url(self,url):
return url.strip()
def valida_url(self):
if self.url == "":
raise ValueError('A URL está vazia')
def valida_separadores(self):
l = []
for caractere_separador in self.separadores:
caractere_na_url = caractere_separador in self.url
l.append(caractere_na_url)
if not any(l):
raise ValueError("A URL não contém nenhum dos caracteres listados")
def lista_a_recortar(self):
indices_a_recortar = []
for i in range(0,len(self.url)):
if self.url[i] in self.separadores:
indices_a_recortar.append(i)
return indices_a_recortar
def get_separador_base(self):
separador_base = self.lista_a_recortar()[0]
return separador_base
def get_url_base(self):
url_base = self.url[:self.get_separador_base()]
return url_base
def get_url_parametros(self):
url_parametros = self.url[self.get_separador_base() + 1:]
return url_parametros
def get_valores_e_parametros(self):
lista_recortar = self.lista_a_recortar()
lista_valores_e_parametros = []
for recorte in range(1,len(lista_recortar)):
item = self.url[lista_recortar[recorte - 1] + 1:lista_recortar[recorte]]
lista_valores_e_parametros.append(item)
ultimo_recorte = lista_recortar[len(lista_recortar) - 1]
ultimo_item = self.url[ultimo_recorte + 1:]
lista_valores_e_parametros.append(ultimo_item)
return lista_valores_e_parametros
url = "bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar"
lista = ['?','&', '=']
teste = ExtratorUrl(url, lista)
print(teste.get_url_base())
print(teste.get_url_parametros())
print(teste.get_valores_e_parametros())