【发布时间】:2012-05-25 19:54:31
【问题描述】:
我花了一个下午的大部分时间尝试将字典对象修补为 utf-8 编码来代替 unicode。我正在尝试找到最快和性能最好的方法来扩展字典对象并确保它的条目、键和值都是 utf-8。
这是我想出的,它可以完成工作,但我想知道可以进行哪些改进。
class UTF8Dict(dict):
def __init__(self, *args, **kwargs):
d = dict(*args, **kwargs)
d = _decode_dict(d)
super(UTF8Dict,self).__init__(d)
def __setitem__(self,key,value):
if isinstance(key,unicode):
key = key.encode('utf-8')
if isinstance(value,unicode):
value = value.encode('utf-8')
return super(UTF8Dict,self).__setitem__(key,value)
def _decode_list(data):
rv = []
for item in data:
if isinstance(item, unicode):
item = item.encode('utf-8')
elif isinstance(item, list):
item = _decode_list(item)
elif isinstance(item, dict):
item = _decode_dict(item)
rv.append(item)
return rv
def _decode_dict(data):
rv = {}
for key, value in data.iteritems():
if isinstance(key, unicode):
key = key.encode('utf-8')
if isinstance(value, unicode):
value = value.encode('utf-8')
elif isinstance(value, list):
value = _decode_list(value)
elif isinstance(value, dict):
value = _decode_dict(value)
rv[key] = value
return rv
改善以下任何一项的建议将非常有帮助:
- 性能
- 涵盖更多边缘情况
- 错误处理
【问题讨论】:
-
你为什么要这样做?只需将您的键/值存储为 unicode 对象,然后根据需要进行编码。在你的扩展中你最需要的是一个 isinstance 检查,如果它失败了就会引发一个异常。
-
最佳实践是在代码的输入和输出边缘进行编码和解码(因此在收到时立即解码,在发送时尽可能晚地编码),并在内部保持 unicode。
-
为什么要强制?只需制作一个字典并仅添加具有正确编码的键/值。尝试强制类型和编码不是 Pythonic。
-
“UTF-8 而不是 Unicode”。说什么?
-
@tchrist:Python 对“str”(字节字符串)和“unicode”(一系列 unicode 代码点)有不同的类型。 UTF-8 是 Unicode 的一种特殊编码;它指定字节字符串中的字节应该是什么。在 Python 解释器中自己尝试一下:
s = u'résumé'; s; t = s.encode('utf8'); t;。 OP 需要字节字符串(以 UTF-8 编码),而不是 Unicode 字符串(与编码无关,无论是 UTF-8 还是 UTF-16 或其他)。
标签: python unicode utf-8 dictionary