Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Erro(ExtratorUrl.valor_parametro() missing 1 required positional argument: 'parametro_busca')

Não sei o que eu fiz de errado poderia me ajudar?

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 self.url:
            raise ValueError("A URL está vazia")

    @property
    def url_base(self):
        indice_interrogacao = self.url.find('?')
        url_base = self.url[:indice_interrogacao]
        return url_base

    @property
    def url_parametros(self):
        indice_interrogacao = self.url.find('?')
        url_parametros = self.url[indice_interrogacao + 1:]
        return url_parametros                

    @property
    def valor_parametro(self, parametro_busca):
        indice_parametro = self.url_parametros().find(parametro_busca)
        indice_valor = indice_parametro + len(parametro_busca) + 1
        indice_e_comercial = self.url_parametros().find('&', indice_valor)
        indice_e_comercial_vazio = indice_e_comercial == -1
        if indice_e_comercial_vazio:
            valor = self.url_parametros()[indice_valor:]
        else:
            valor = self.url_parametros()[indice_valor:indice_e_comercial]
        return valor

extrator_url = ExtratorUrl('bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar')
valor_quantidade = extrator_url.valor_parametro('quantidade')
print(valor_quantidade)
2 respostas
solução!

Olá Caio, tudo bem com você?

O erro apresentado está relacionado ao uso das properties (@property), será necessário realizarmos algumas modificações no código para que ele seja executado corretamente, deixo abaixo a descrição do local de mudança e o motivo.

Quando fazemos o uso do decorator @property em um método estamos definindo esse método como do tipo getter, um método do tipo getter tem como objetivo retornar algo, nesse método o único parâmetro que deve ser recebido será o objeto (self), sabendo disso, será necessário removermos o decorator @property do método valor_parametro, como esse método necessita do atributo parametro_busca não podemos usar o decorator @property.

Assim, peço que remova o decorator @property do método parametro_busca.

A segunda parte da mudança diz respeito ao modo que instanciamos (chamamos) um método que possui um decorator @property, quando um método possui esse decorator ele deve ser usado como se fosse um atributo, nesse caso, quando usamos o método url_parametros devemos chamá-lo como um atributo do objeto (self) ou seja, sem os parênteses:

# Como está no seu código
self.url_parametros()

# Como deve ser
self.url_parametros

Assim, será necessário modificarmos a chamada do método url_parametros, retirando os parênteses.

Todas as mudanças vão acontecer no método valor_parametro, deixo abaixo o método já com as mudanças para comparação.

def valor_parametro(self, parametro_busca):
    indice_parametro = self.url_parametros.find(parametro_busca)
    indice_valor = indice_parametro + len(parametro_busca) + 1
    indice_e_comercial = self.url_parametros.find('&', indice_valor)
    indice_e_comercial_vazio = indice_e_comercial == -1
    if indice_e_comercial_vazio:
        valor = self.url_parametros[indice_valor:]
    else:
        valor = self.url_parametros[indice_valor:indice_e_comercial]
    return valor

Peço que modifique os pontos listados, remova o decorador @property do método valor_parametro e remova os parênteses na chamada do método url_parametros. Após realizar as mudanças, basta salvar o arquivo e executá-lo.

Caso queira se aprofundar em relação ao tema property, recomendo que assista a aula Propriedades do curso Python: entendendo a Orientação a Objetos da Alura, que tratará desse tema. Para ler, recomendo o artigo Propriedades Getters e Setters - O artigo está em inglês, caso tenha dificuldade com o idioma, recomendo o uso do tradutor do navegador.

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

Fico à disposição.

Abraços e bons estudos.

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

Obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software