2012-05-25 2 views
3

오후에 유니 코드 대신 UTF-8로 사전 객체를 패치하는 데 더 많은 시간을 보냈습니다. 사전 객체를 확장하고 항목, 키 및 값이 모두 utf-8인지 확인하는 가장 빠르고 최상의 수행 방법을 찾으려고합니다.파이썬 강제 dict 엔트리가 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 

제안은 매우 도움이 될 것입니다 :

  • 성능
  • 커버 더 에지의 경우
  • 오류 처리 나는 의견에 동의
+10

왜이 작업을 수행하고 있습니까? 키/값을 유니 코드 오브젝트로 저장 한 다음 필요에 따라 인코딩하십시오. 확장 프로그램에서 가장 필요한 것은 isinstance 검사로 실패 할 경우 예외를 발생시킵니다. – Marcin

+3

모범 사례는 코드의 입력 및 출력 가장자리에서 인코딩 및 디코딩 (송신 즉시 가능한 한 디코드, 가능한 한 늦게 인코딩)을하고 유니 코드로 유지합니다. –

+2

왜 아무것도 강요합니까? 사전을 만들고 올바른 인코딩으로 키/값을 추가하기 만하면됩니다. 유형과 인코딩을 강제하는 것은 Pythonic이 아닙니다. –

답변

3

이 말은 잘못된 것일 수 있습니다. 당신의 DICT에 유니 코드 개체를 추가 할

>>> d = UTF8Dict() 
>>> d.setdefault(u'x', u'y') 
  • d.update을 사용할 수 있습니다

    1. d.setdefault이 DICT에 유니 코드 개체를 추가 할 수 있습니다 : 그것은 여기에 현재 계획에 약간의 구멍이 말했다 하십시오 딕셔너리에 포함

      >>> d = UTF8Dict() 
      >>> d.update({u'x': u'y'}) 
      
    2. 목록 값은 표준 목록 operati을 사용하여 유니 개체를 포함하도록 수정 될 수있다 ons. 예컨대 :

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

    당신이 당신의 데이터 구조는 UTF-8 문자열이 포함되어 있는지 확인 하시겠습니까?

  • +2

    _I_하지 마십시오. 이 연결 대상인 끝점은 utf-8 만 처리합니다. 이들의 정확한 코드는'type이 str : hate_my_life() '인 경우입니다. 그래서 이것이 모든 것을 패치하는 이유입니다. 나는 그것들을'isinstance (s, basestring) '로 바꾸라고 요청했으나 "아직 우리는 유니 코드를 준비하고 있지 않다."아직 그것을 알아 내지 못했다. – lukecampbell

    +0

    @lukecampbell 입력을 dict로 가져오고, dict (그리고 신경 쓰는 하부 구조)을 걷고, 유니 코드 문자열을 인코딩하는 함수를 작성하는 것이 현실적일까요? 그런 다음 입력 dicts에 utf-8이 필요한 외부 "끝점"코드를 사용하기 바로 전에이 함수를 호출 할 수 있습니다. –

    +0

    원래 경로를 따라 갔기 때문에 객체 정의에서 두 함수가 있지만 dict에서 확장되는 기본 끝점은 utf-8을 준수하도록이 객체를 확장하려고합니다. 클라이언트가 dicts를 다룰 때 utf-8을 사용한다는 정책을 시행 할 수는 없습니다. – lukecampbell