티스토리 뷰

어느날 파이썬의 listdict 를 혼합된 값을 처리하려는데, 콘솔에서 자꾸 에러가 출력되서 확인해 보니 어떤 패키지에서 한글을 bytes 로 주더군요. 예를 들자면 b'안녕?' 이런 형식으로요.

그러다보니, json_dumps 도 동작을 안하더군요. 멍청한 저로서는 무식하게, 순회하면서 bytes 의 값들을 전부 utf-8 문자열로 바꿔주는 방법밖에 떠오르지 않아 만들었습니다.

코드는 다음과 같습니다:




#!-*- coding: utf-8 -*-


userDefine = {}


def process(_value):

    if type(_value) in userDefine.keys():
        return userDefine[type(_value)](_value)

    return _value


def traversalArray(a):
    ta = []
    i = 0
    for v in a:
        if isinstance(v, dict):
            ta.append(traversalDict(v))
        elif isinstance(v, list):
            ta.append(traversalArray(v))
        else:
            ta.append(process(v))
    return ta


def traversalDict(d):
    td = {}
    for k, v in d.items():
        if isinstance(v, list):
            td[k] = traversalArray(v)
        elif isinstance(v, dict):
            td[k] = traversalDict(v)
        else:
            td[k] = process(v)
    return td


def traversal(o):

    ret = None
    if isinstance(o, list):
        ret = traversalArray(o)
    elif isinstance(o, dict):
        ret = traversalDict(o)
    else:
        return False

    return ret


def addProcessor(_type, _func):
    if _type is dict or _type is list:
        return False

    userDefine[_type] = _func
    return True

위 코드는 python3.6 에서만 테스트해보았습니다.

샘플입니다:

   def processForStr(v):
        return int(v)

    def processForByte(v):
        return v.decode('utf-8')

    addProcessor(str, processForStr)
    addProcessor(bytes, processForByte)

    sample = {
        "key1": "1",
        "key2": "2",
        "subnesting": [
            "3",
            "4",
            "5",
        ],
        1: "6",
        2: "7",
        "byte": b'\xec\x95\x88\xeb\x85\x95?'
    }
    print(sample)
    result = traversal(sample)
    print(result)

위 결과 입니다:

# sample
{'key1': '1', 'key2': '2', 'subnesting': ['3', '4', '5'], 1: '6', 2: '7', 'byte': b'\xec\x95\x88\xeb\x85\x95?'}

# result
{'key1': 1, 'key2': 2, 'subnesting': [3, 4, 5], 1: 6, 2: 7, 'byte': '안녕?'}