我正在从一个代码“层”收到命令,对该命令进行一些计算/修改,然后再将其传递到另一个“层”。原始dict的键和“字符串”值是unicode,但是将它们传递到的层只接受str。
unicode
str
这将经常被调用,所以我想知道什么是最快的转换方法:
{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }
…至:
{ 'spam': 'eggs', 'foo': True, 'bar': { 'baz': 97 } }
……请记住,非“字符串”值必须保持其原始类型。
有什么想法吗?
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)
如果您需要支持其他容器类型,希望可以很明显地遵循该模式并为其添加案例。