Я думаю, что приведенный ниже код может быть то, что вы хотите
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))
выход
interfaces%5B1%5D%5Binterface%5D=inter2&name=interface_name&interfaces%5B0%5D%5Binterface%5D=inter1
который похож
interfaces[1][interface]=inter2&name=interface_name&interfaces[0][interface]=inter1
PS: вы можете используйте OrderDict
для замены dict
Зачем? Это не является стандартным форматом. Вещь с квадратными скобками - специфическая для PHP особенность, не встречающаяся в большинстве других языков/фреймворков или любого веб-стандарта. – bobince
Это не может быть чистый RFC-описанный стандарт IETF/W3C, поддерживаемый святой макароном, но он так часто используется в наши дни, что его включение в стандартную библиотеку Python не оспаривает мое понимание. Я разработал веб-приложения на нескольких платформах и языках, и это всегда было конвенцией. И это включает в себя среды на основе Python, такие как Django: так что нет, это больше не просто PHP. – pablobm
Именно поэтому люди, которые приходят сюда позже, знают, что этот код близок к работе, но не работает для объектов с> 1 уровнем вложенности. Таким образом, объекты с> 1 уровнем вложенности загружаются обратно в верхнюю часть хэша. –