Keyfi derinden yuvalanmış dikte ve listeleri işleyen daha genelleştirilmiş bir çözüm:
def dumpclean(obj):
if isinstance(obj, dict):
for k, v in obj.items():
if hasattr(v, '__iter__'):
print k
dumpclean(v)
else:
print '%s : %s' % (k, v)
elif isinstance(obj, list):
for v in obj:
if hasattr(v, '__iter__'):
dumpclean(v)
else:
print v
else:
print obj
Bu çıktıyı üretir:
A
color : 2
speed : 70
B
color : 3
speed : 60
Benzer bir ihtiyaçla karşılaştım ve kendim için bir egzersiz olarak daha sağlam bir fonksiyon geliştirdim. Başka bir değeri olabilir diye buraya dahil ediyorum. Nosetest'i çalıştırırken, çağrıdaki çıkış akışını belirtmenin yararlı olduğunu gördüm, böylece sys.stderr kullanılabilir.
import sys
def dump(obj, nested_level=0, output=sys.stdout):
spacing = ' '
if isinstance(obj, dict):
print >> output, '%s{' % ((nested_level) * spacing)
for k, v in obj.items():
if hasattr(v, '__iter__'):
print >> output, '%s%s:' % ((nested_level + 1) * spacing, k)
dump(v, nested_level + 1, output)
else:
print >> output, '%s%s: %s' % ((nested_level + 1) * spacing, k, v)
print >> output, '%s}' % (nested_level * spacing)
elif isinstance(obj, list):
print >> output, '%s[' % ((nested_level) * spacing)
for v in obj:
if hasattr(v, '__iter__'):
dump(v, nested_level + 1, output)
else:
print >> output, '%s%s' % ((nested_level + 1) * spacing, v)
print >> output, '%s]' % ((nested_level) * spacing)
else:
print >> output, '%s%s' % (nested_level * spacing, obj)
Bu işlevi kullanarak, OP'nin çıkışı şöyle görünür:
{
A:
{
color: 2
speed: 70
}
B:
{
color: 3
speed: 60
}
}
kişisel olarak daha yararlı ve açıklayıcı buldum.
Biraz daha az önemsiz örneği göz önüne alındığında:
{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}
OP'nin talep ettiği çözüm bunu sağlar:
test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(1, 2)
(3, 4)
oysa 'gelişmiş' versiyon bunu verir:
{
test:
[
{
1: 3
}
]
test3:
{
(1, 2):
[
abc
def
ghi
]
(4, 5): def
}
test2:
[
(1, 2)
(3, 4)
]
}
Umarım bu işlevsellik arayan bir sonraki kişiye biraz değer katar.