Формат форматирования строки форматирования
Интересно, есть ли простой способ форматирования строк 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 в соответствии с этой формой.
Ответы
Ответ 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',
},
}
Обратите внимание, что я сортирую, считая, что все ключи являются строками или, по крайней мере, хорошими объектами здесь.