DATA = { u'spam': u'eggs', u'foo': frozenset([u'Gah!']), u'bar': { u'baz': 97 },
u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])]}
def convert(data):
if isinstance(data, basestring):
return str(data)
elif isinstance(data, collections.Mapping):
return dict(map(convert, data.iteritems()))
elif isinstance(data, collections.Iterable):
return type(data)(map(convert, data))
else:
return data
print DATA
print convert(DATA)
# Prints:
# {u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])], u'foo': frozenset([u'Gah!']), u'bar': {u'baz': 97}, u'spam': u'eggs'}
# {'bar': {'baz': 97}, 'foo': frozenset(['Gah!']), 'list': ['list', (True, 'Maybe'), set(['and', 'a', 'set', 1])], 'spam': 'eggs'}
Предположения:
- Вы импортировали модуль коллекций и можете использовать предоставляемые им абстрактные базовые классы
- Вы готовы конвертировать, используя кодировку по умолчанию (используйте
data.encode('utf-8')
вместо str(data)
, если вам нужна явная кодировка).
Если вам нужно поддерживать другие типы контейнеров, надеюсь, очевидно, как следовать шаблону и добавлять к ним регистры.