martes, 18 de diciembre de 2012

Parsear os parámetros dunha petición HTTP [Twitcode XX][Python]

Cando facemos unha petición por HTTP temos a opción de mandar parámetros na URL despois dun `?`, separados por `&` e co formato `<chave>=<valor>` entón... como lelo?

def urldecode(opt): return {unquote(k): unquote(v) for k, v in [e.split('=', 1) for e in opt.split("&") if '=' in e]}

(Usa o unquote de urllib)

Por exemplo:
>>> from urllib import unquote
>>> def urldecode(opt): return {unquote(k): unquote(v) for k, v in [e.split('=', 1) for e in opt.split("&") if '=' in e]}
... 
>>> urldecode("continue=https%3A%2F%2Fgroups.google.com%2Fd%2Foverview&service=groups2&passive=true")
{'passive': 'true', 'continue': 'https://groups.google.com/d/overview', 'service': 'groups2'}
>>>


Como funciona?

De dentro cara fora, `opt.split("&")` divide os pares de parámetros.


E a partir de aquí todo o truco está nas list comprehensions que permite iterar sobre estructuras de datos e operar sobre os elementos, por exemplo neste caso
[e.split('=', 1) for e in opt.split("&") if '=' in e]
que sería buscar todos os elementos do resultado anterior que conteñan '=' e dividilos por ese carácter, sería coma escribir
resultado = []
for e in opt.split("&"):
    if '=' in e:
        resultado.append(e.split('=', 1))


Por último quedaría tomar a lista de pares separados por '=', facer `unquote()` dos elementos e introducilos como chave e valor nun diccionario, os dicccionarios tamén teñen o equivalente os list comprehensions, entón faríamos:
{unquote(k): unquote(v) for k, v in result}

Isto equivalería a
params = {}
for k, v in result:
    params[unquote(k)] = unquote(v)

No hay comentarios:

Publicar un comentario