Python强制dict条目为utf-8

时间:2012-05-25 19:54:32

标签: python unicode utf-8 dictionary

我花了一个下午的大部分时间尝试将字典对象修补为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

改善以下任何一项建议会非常有用:

  • 性能
  • 涵盖更多边缘案例
  • 错误处理

1 个答案:

答案 0 :(得分:3)

我同意那些可能被误导的评论。也就是说,这是你目前计划中的一些漏洞:

  1. d.setdefault可用于将unicode对象添加到dict:

    >>> d = UTF8Dict()
    >>> d.setdefault(u'x', u'y')
    
  2. d.update可用于将unicode对象添加到dict:

    >>> d = UTF8Dict()
    >>> d.update({u'x': u'y'})
    
  3. 可以使用任何标准列表操作修改dict中包含的列表值以包括unicode对象。例如:

    >>> d = UTF8Dict(x=[])
    >>> d['x'].append(u'x')
    
  4. 为什么你想确保你的数据结构只包含utf-8字符串?