Creo que el código de abajo puede ser lo que quiere
import urllib.parse
def url_encoder(params):
g_encode_params = {}
def _encode_params(params, p_key=None):
encode_params = {}
if isinstance(params, dict):
for key in params:
encode_key = '{}[{}]'.format(p_key,key)
encode_params[encode_key] = params[key]
elif isinstance(params, (list, tuple)):
for offset,value in enumerate(params):
encode_key = '{}[{}]'.format(p_key, offset)
encode_params[encode_key] = value
else:
g_encode_params[p_key] = params
for key in encode_params:
value = encode_params[key]
_encode_params(value, key)
if isinstance(params, dict):
for key in params:
_encode_params(params[key], key)
return urllib.parse.urlencode(g_encode_params)
if __name__ == '__main__':
params = {'name': 'interface_name', 'interfaces': [{'interface': 'inter1'}, {'interface': 'inter2'}]}
print(url_encoder(params))
la salida es
interfaces%5B1%5D%5Binterface%5D=inter2&name=interface_name&interfaces%5B0%5D%5Binterface%5D=inter1
que es parecerse a
interfaces[1][interface]=inter2&name=interface_name&interfaces[0][interface]=inter1
PD: es posible que desee use OrderDict
para reemplazar dict
anterior
¿Por qué debería? Esto no es de ninguna manera un formato estándar. Lo que aparece entre corchetes es una peculiaridad específica de PHP que no está presente en la mayoría de los otros lenguajes/marcos o en cualquier estándar web. – bobince
Puede que no sea un estándar de macarrones sagrados de sangre pura descrito por IETF/W3C, pero se usa tan comúnmente hoy en día que no estar incluido en la biblioteca estándar de Python desafía mi comprensión. He desarrollado aplicaciones web en varias plataformas e idiomas, y esta siempre ha sido la convención. Y esto incluye entornos basados en Python como Django: así que no, ya no es solo un PHP. – pablobm
Para que la gente que viene más tarde lo sepa, este código casi funciona, pero no funciona para objetos con> 1 nivel de anidación. Por lo tanto, los objetos con> 1 nivel de anidamiento se reinician en la parte superior del hash. –