Comment formater correctement les sorties de chaîne de dict

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 peu illisible …

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

Pour autant que je sache à propos de Python, je devrais écrire beaucoup de code avec beaucoup de cas spéciaux et d’appels ssortingng.replace (), où ce problème lui-même ne ressemble pas à un problème de 1000 lignes.

Veuillez suggérer le moyen le plus simple de formater un 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) 

Sortie:

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

La mise en garde de cette approche est que certaines choses ne sont pas sérialisables par JSON. Un code supplémentaire serait requirejs si le dict contenait des éléments non sérialisables tels que 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 format pprint 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'}}) 

Sortie:

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

Notez que je suppose que toutes les clés sont des chaînes, ou au moins de jolis objects ici