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

Implementar dict comprehension na classe

Criei uma classe para fazer a extração das informações, e queria usar um dict comprehension mas não estou sabendo implementar corretamente. Segue o código:

url = "https://bytebank.com/cambio?moedaOrigem=real&moedaDestino=dolar&quantidade=100"

class UrlParams:
    """Extrai todos os elementos de uma URL."""
    def __init__(self, url_string: str):
        self.__original = url_string
        self.__elementos = self.__separar_elementos(url_string)

        if self.__elementos["params"]:
            self.__elementos["params"] = self.__separar_parametros(
                    self.__elementos["params"])

    def __separar_elementos(self, url: str) -> dict:
        elem = re.match(r"^(?P<protocolo>https?):\/\/"
                        "((?P<subdomain>[a-zA-Z0-9]{1,256})\.)?"
                        "(?P<domain>[a-zA-Z0-9]{1,256})"
                        "\.(?P<tld>[a-zA-Z0-9.]{1,63})"
                        "(\/(?P<page>[a-zA-Z0-9()%+=]{1,256}(\.x?html?)?))?"
                        "(\?(?P<params>.*))?$"
                        , url)

        return elem.groupdict()

    def __separar_parametros(self, params_value: str) -> dict:
        params_list = params_value.split('&')
        #params_dict = {k: v for item in params_list for (k, v) in item.split('=')}
        params_dict = dict()
        for item in params_list:
            kv = item.split('=')
            params_dict[kv[0]] = kv[1]

        return params_dict

    @property
    def elementos(self):
        return self.__elementos

    def __str__(self):
        return self.__original

Como faz para para atribuir o split ["key", "value"] para {"key": "value"}?

2 respostas
solução!

Oii Felipe, como você está ?

Peço desculpas pela demora em obter um retorno.

Acredito que você esteja tentando utilizar o exemplo da aula para aplicar em um cenário pessoal e como você não explicitou a forma como está instanciando a classe e como seria a string que a função __separar_parametros recebe, elaborei um exemplo simples de como você poderia aplicar o dict comprehensions em um cenário onde as chaves e os valores estão separados pelo símbolo do ê comercial (&) e um conjunto de chave e valor estão separados por vírgula:

palavras = "chave1&valor1,chave2&valor2,chave3&valor3"

E o dict comprehension ficaria da seguinte forma:

resultado = {chave: valor for chave, valor in (item.split('&') for item in palavras.split(','))}
print(f"Dicionário: {resultado}")

Resultado:

{'chave1': 'valor1', 'chave2': 'valor2', 'chave3': 'valor3'}

Caso o seu cenário não seja esse, peço que detalhe com mais informações sobre como é o seu cenário e o resultado que gostaria de obter.

Grande abraço e bons estudos!

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

Sim, isso faz sentido. No código que eu tinha escrito, ele pedia key: value para o item que estava sendo definido, porém ainda não possuía uma tuple com dois valores para retornar.

params_dict = {k: v for item in params_list for (k, v) in item.split('=')}
params_dict = {k: v for k, v in (item.split('=') for item in params_list)}

Obrigado por ter conferido.