Cómo dar formato a las salidas de cadena de dict muy bien

Me pregunto si hay una manera fácil de formatear cadenas de dict-salidas como esta:

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

…, donde un simple str (dict) simplemente te daría un ilegible …

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

Por todo lo que sé sobre Python, tendría que escribir muchos códigos con muchos casos especiales y llamadas a string.replace (), donde este problema en sí no se parece tanto a un problema de 1000 líneas.

Por favor, sugiera la forma más fácil de formatear cualquier dictado de acuerdo con esta forma.

Dependiendo de lo que esté haciendo con la salida, una opción es usar JSON para la pantalla.

 import json x = {'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}} print json.dumps(x, indent=2) 

Salida:

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

La advertencia a este enfoque es que algunas cosas no son serializables por JSON. Se requeriría algún código adicional si el dict contenía elementos no serializables como clases o funciones.

Usar pprint

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

Esto produce

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

Juega un poco con el formato de impresión y puedes obtener el resultado deseado.

 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'}}) 

Salida:

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

Tenga en cuenta que estoy suponiendo que todas las claves son cadenas, o al menos objetos bonitos aquí