Je me demande s'il existe un moyen facile de formater des chaînes de sorties dict telles que celle-ci:
{
'planet' : {
'name' : 'Earth',
'has' : {
'plants' : 'yes',
'animals' : 'yes',
'cryptonite' : 'no'
}
}
}
..., où un simple str (dict) vous donnerait juste un tout à fait illisible ...
{'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}}
Pour autant que je sache sur Python je devrais écrire beaucoup de code avec de nombreux cas spéciaux et des appels string.replace (), où ce problème lui-même ne ressemble pas tellement à un 1000 -lignes-problème.
Veuillez suggérer la manière la plus simple de formater n'importe quel dict en fonction de cette forme.
Selon ce que vous faites avec la sortie, une option consiste à utiliser JSON pour l'affichage.
import json
x = {'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}}
print json.dumps(x, indent=2)
Production:
{
"planet": {
"has": {
"plants": "yes",
"animals": "yes",
"cryptonite": "no"
},
"name": "Earth"
}
}
La mise en garde à cette approche est que certaines choses ne sont pas sérialisables par JSON. Un code supplémentaire serait nécessaire si le dict contenait des éléments non sérialisables comme des classes ou des fonctions.
Utiliser pprint
import pprint
x = {
'planet' : {
'name' : 'Earth',
'has' : {
'plants' : 'yes',
'animals' : 'yes',
'cryptonite' : 'no'
}
}
}
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(x)
Cette sorties
{ 'planet': { 'has': { 'animals': 'yes',
'cryptonite': 'no',
'plants': 'yes'},
'name': 'Earth'}}
Jouez avec le formatage de l'impression et vous pouvez obtenir le résultat souhaité.
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'}})
Production:
{
'planet': {
'has': {
'plants': 'yes',
'animals': 'yes',
'cryptonite': 'no',
},
'name': 'Earth',
},
}
Notez que je suppose que toutes les clés sont des chaînes, ou du moins de jolis objets ici