Подтвердить что ты не робот

Формат форматирования строки форматирования

Интересно, есть ли простой способ форматирования строк dict-выходов, таких как:

{
  'planet' : {
    'name' : 'Earth',
    'has' : {
      'plants' : 'yes',
      'animals' : 'yes',
      'cryptonite' : 'no'
    }
  }
}

..., где простая str (dict) просто даст вам довольно нечитаемый...

{'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}}

Насколько я знаю о Python, мне пришлось бы написать много кода со многими специальными случаями и вызовами string.replace(), где эта проблема сама по себе не похожа на проблему с 1000 строк.

Пожалуйста, предложите самый простой способ форматирования любого dict в соответствии с этой формой.

4b9b3361

Ответ 1

В зависимости от того, что вы делаете с выходом, одним из вариантов является использование JSON для отображения.

import json
x = {'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}}

print json.dumps(x, indent=2)

Вывод:

{
  "planet": {
    "has": {
      "plants": "yes", 
      "animals": "yes", 
      "cryptonite": "no"
    }, 
    "name": "Earth"
  }
}

Предостережение к этому подходу заключается в том, что некоторые вещи не могут быть сериализованы JSON. Некоторый дополнительный код был бы необходим, если в dict содержались несериализуемые элементы, такие как классы или функции.

Ответ 2

Использовать pprint

import pprint

x  = {
  'planet' : {
    'name' : 'Earth',
    'has' : {
      'plants' : 'yes',
      'animals' : 'yes',
      'cryptonite' : 'no'
    }
  }
}
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(x)

Выводит

{   'planet': {   'has': {   'animals': 'yes',
                             'cryptonite': 'no',
                             'plants': 'yes'},
                  'name': 'Earth'}}

Играйте с форматированием отпечатка, и вы можете получить желаемый результат.

Ответ 3

def format(d, tab=0):
    s = ['{\n']
    for k,v in d.items():
        if isinstance(v, dict):
            v = format(v, tab+1)
        else:
            v = repr(v)

        s.append('%s%r: %s,\n' % ('  '*tab, k, v))
    s.append('%s}' % ('  '*tab))
    return ''.join(s)

print format({'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}})

Вывод:

{
'planet': {
  'has': {
    'plants': 'yes',
    'animals': 'yes',
    'cryptonite': 'no',
    },
  'name': 'Earth',
  },
}

Обратите внимание, что я сортирую, считая, что все ключи являются строками или, по крайней мере, хорошими объектами здесь.