а как такой код? можно его существенно улучшить?
эта функция печатает словари/списки произвольной вложенности содержащие инт флоат юникод строки обычные строки
dl2 = { u'ругательства':{ u'блин': -1, u'пипец': -2}, 1:2,'строка': u'вот', u'юникод': 5, 777.5: 5.5, u'похвала': {u'молодец': 2}, u'чёрт':{u'весна': u'зима'}, 5:[u'1',u'2', ], 8: [[{ u'ругательства':{ u'блин': -1, u'пипец': -2}, 'строка': u'вот', u'юникод': 5, 777.5: 5.5, u'похвала': {u'молодец': 2}, u'чёрт':{u'весна': u'зима'}, 5:[u'1',u'2', ]},'5'], u'привет', [u'вот', [u'вот', [u'оно']]], 11.5, u'этот', u'тот', [u'вот', u'жесть'], [u'он', u'другой', [u'он', u'они']], {u'вон':8}]}
def print_list(list_, encoding='utf-8'):
"""возвращает юникод строку со списками"""
result = []
for x in list_:
if isinstance(x, list):
#print '[spisok]'
result.append(print_list(x))
elif isinstance(x, unicode):
#print "u'unistroka'"
result.append("'%s'" % x)
elif isinstance(x, str):
#print "'stroka'"
result.append("'%s'" % x.decode(encoding))
elif isinstance(x, int) or isinstance(x, float):
#print '12345678'
result.append("%s" % x)
elif isinstance(x, dict):
#print '[slovar]'
result.append("%s" % print_dict(x))
else:
print '!!!!!!!!LIST!!!!!!!!!!!!!'
result.append(str(x))
return "[%s]" % ', '.join(result)
def print_dict(dict_, encoding='utf-8'):
"""возвращает юникод строку со словарями"""
result = []
for x in dict_:
#обработаем ключ
if isinstance(x, unicode):
#print 'kluch=unicode stroka'
result.append("'%s':" % x)
elif isinstance(x, str):
#print 'kluch=stroka'
result.append("'%s':" % x.decode(encoding))
elif isinstance(x, int) or isinstance(x, float):
#print 'kluch=chislo'
result.append("%s:" % x)
else:
print '!!!!!!!!!!!!!!!!!!!!!'
result.append(str(x))
#обработаем значение
if isinstance(dict_[x], dict):
#print 'znach=slovar'
result.append("%s" % print_dict(dict_[x]))
elif isinstance(dict_[x], str):
#print 'znach=stroka'
result.append("'%s'" % dict_[x].decode(encoding))
elif isinstance(dict_[x], unicode):
#print 'znach=unicodestroka'
result.append("'%s'" % dict_[x])
elif isinstance(dict_[x], int) or isinstance(dict_[x], float):
#print 'znach=chislo'
result.append("%s" % dict_[x])
elif isinstance(dict_[x], list):
#print 'znach=list'
result.append("%s" % print_list(dict_[x]))
else:
print '!!!!!!!!!!DICT!!!!!!!!!!!'
result.append(str(x))
h="{%s}" % ', '.join(result)
h=string.replace(h, ":,", ':')#грязный хак(
return h
#собственно функция
def print_dl(dl,encoding='utf-8'):
"""эта функция печатает словари/списки произвольной вложенности содержащие инт флоат юникод строки обычные строки"""
if isinstance(dl, dict):
return print_dict(dl)
elif isinstance(dl, list):
print '555'
return print_list(dl)
else:
print '!!!!!error dl!!!!!!!!!!!!!'
ответ:
{777.5: 5.5, 1: 2, 'чёрт': {'весна': 'зима'}, 'строка': 'вот', 'похвала': {'молодец': 2}, 'ругательства': {'блин': -1, 'пипец': -2}, 8: [[{777.5: 5.5, 'чёрт': {'весна': 'зима'}, 'строка': 'вот', 5: ['1', '2'], 'ругательства': {'блин': -1, 'пипец': -2}, 'похвала': {'молодец': 2}, 'юникод': 5}, '5'], 'привет', ['вот', ['вот', ['оно']]], 11.5, 'этот', 'тот', ['вот', 'жесть'], ['он', 'другой', ['он', 'они']], {'вон': 8}], 'юникод': 5, 5: ['1', '2']}
проверяем пиотоном 3,1:
{777.5: 5.5, 1: 2, 'чёрт': {'весна': 'зима'}, 'похвала': {'молодец': 2}, 'ругательства': {'блин': -1, 'пипец': -2}, 8: [[{777.5: 5.5, 'чёрт': {'весна': 'зима'}, 5: ['1', '2'], 'ругательства': {'блин': -1, 'пипец': -2}, 'строка': 'вот', 'похвала': {'молодец': 2}, 'юникод': 5}, '5'], 'привет', ['вот', ['вот', ['оно']]], 11.5, 'этот', 'тот', ['вот', 'жесть'], ['он', 'другой', ['он', 'они']], {'вон': 8}], 'юникод': 5, 'строка': 'вот', 5: ['1', '2']}