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

[Bug] Tentei arrumar mas continua não funcionando

import re
class Extrator_url:

    def __init__(self, url):
        self.url = self.sanatiza_url(url)
        self.validacao_url(url)

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

    def validacao_url(self):
        if not self.url:
            raise ValueError("A url está vazia!")

        padrao_url = re.compile("(http(s)?://)?(www.)?bytebank.com(.br)?/cambio")
        match = padrao_url.match(self.url)
        if not match:
            raise ValueError("A url é inválida!")

    def extrair_url_base(self):
        indice_url_base = self.url.find('?')
        url_base = self.url[:indice_url_base + 1]
        return url_base

    def url_parametros(self):
        indice_url_base = self.url.find('?')
        url_parametros = self.url[self.extrair_url_base() + 1:]
        return url_parametros

    def buscar_parametro(self, url_parametros):
        indice_parametro = self.url_parametros().find(url_parametros)
        indice_valor = indice_parametro + len(url_parametros) + 1
        indice_e_comercial = self.url_parametros().find('&', indice_valor)

        if indice_e_comercial == -1:
            valor = self.url_parametros()[indice_valor:]
        else:
            valor = self.url_parametros()[indice_valor:indice_e_comercial]
        return valor

extrator_url = Extrator_url("bytebank.com/cambio?moedaDestino=dolar&moedaOrigem=real")
valor_moeda_destino = extrator_url.buscar_parametro('moedaDestino')
print(valor_moeda_destino)

Erro apontado:

line 44, in <module>
    extrator_url = Extrator_url("bytebank.com/cambio?moedaDestino=dolar&moedaOrigem=real")

line 6, in __init__
   self.validacao_url(url)
TypeError: Extrator_url.validacao_url() takes 1 positional argument but 2 were given
2 respostas
solução!

Olá, tudo bem com você?

O erro apresentado, TypeError: Extrator_url.validacao_url() takes 1 positional argument but 2 were given, está informando que a função validacao_url() esperava receber apenas um parâmetro, mas foi passado dois. Nessa função após a refatoração do código, não será necessário passar outro parâmetro, ela irá trabalhar apenas com o parâmetro self.

Será necessário realizar a correção em três partes do código, deixo abaixo os pontos listados, com a referência sendo os nomes dos métodos.

Método __init__

  • Neste método, quando ocorre a chamada do método validacao_url() não será mais necessário passarmos o atributo url, o método __init__ deve ser declarado como apresentado abaixo.

      def __init__(self, url):
          self.url = self.sanatiza_url(url)
          self.validacao_url()

Método sanatiza_url

  • Neste método, para que a estrutura condicional if realize a validação correta do tipo presente no parâmetro url, devemos usar a função type() para retornar o tipo presente no parâmetro url. Modifique o método deixando o como abaixo.

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

    Método url_parametros

  • Neste método, quando realizamos o fatiamento da string para coletar a url_parametros, será necessário fazer o uso do índice salvo na variável indice_url_base no lugar da chamada da função extrair_url_base. Caso não seja corrigido, será elevado um erro de tipo (TypeError: can only concatenate str (not "int") to str). Modifique o método deixando-o como a seguir.

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

Após as mudanças salve o arquivo e execute-o e verifique o resultado apresentado.

Código completo com as mudanças descritas já aplicadas.

import re

class Extrator_url:

    def __init__(self, url):
        self.url = self.sanatiza_url(url)
        self.validacao_url()

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

    def validacao_url(self):
        if not self.url:
            raise ValueError("A url está vazia!")

        padrao_url = re.compile("(http(s)?://)?(www.)?bytebank.com(.br)?/cambio")
        match = padrao_url.match(self.url)
        if not match:
            raise ValueError("A url é inválida!")

    def extrair_url_base(self):
        indice_url_base = self.url.find('?')
        url_base = self.url[:indice_url_base + 1]
        return url_base

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

    def buscar_parametro(self, url_parametros):
        indice_parametro = self.url_parametros().find(url_parametros)
        indice_valor = indice_parametro + len(url_parametros) + 1
        indice_e_comercial = self.url_parametros().find('&', indice_valor)

        if indice_e_comercial == -1:
            valor = self.url_parametros()[indice_valor:]
        else:
            valor = self.url_parametros()[indice_valor:indice_e_comercial]
        return valor

extrator_url = Extrator_url("bytebank.com/cambio?moedaDestino=dolar&moedaOrigem=real")
valor_moeda_destino = extrator_url.buscar_parametro('moedaDestino')
print(valor_moeda_destino)

Espero ter lhe ajudado. Fico à disposição.

Abraços e bons estudos.

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

Obrigada! Agora sim deu tudo certo.

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