3

私は午後の大部分を、ユニコードの代わりにutf-8でエンコードされるように辞書オブジェクトにパッチを当てようとして過ごしました。辞書オブジェクトを拡張し、そのエントリ、キー、および値が両方とも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

次のいずれかを改善する提案は非常に役立ちます。

  • パフォーマンス
  • より多くのエッジケースをカバーする
  • エラー処理
4

1 に答える 1

4

私はこれが誤った方向に進んでいる可能性があるというコメントに同意します。そうは言っても、現在のスキームにはいくつかの穴があります。

  1. d.setdefaultdictにUnicodeオブジェクトを追加するために使用できます:

    >>> d = UTF8Dict()
    >>> d.setdefault(u'x', u'y')
    
  2. d.updatedictにUnicodeオブジェクトを追加するために使用できます:

    >>> d = UTF8Dict()
    >>> d.update({u'x': u'y'})
    
  3. dictに含まれるリスト値は、標準のリスト操作を使用して、Unicodeオブジェクトを含むように変更できます。例えば:

    >>> d = UTF8Dict(x=[])
    >>> d['x'].append(u'x')
    

データ構造にutf-8文字列のみが含まれるようにする必要があるのはなぜですか?

于 2012-05-25T20:21:19.243 に答える