Python Box 사용하기

오늘은 Python에서 점(.) 표기법으로 접근하는 딕셔너리인 Box 패키지에 대하여 알아보려 합니다.

개요

Box는 점 표기법으로 접근해서 데이터를 읽고 쓰는 dict입니다.

덕 타이핑으로 인해 오리와 같이 보이고, 운다면 오리라고 생각하는 것처럼 딕셔너리와 호환됩니다.

box 객체는 to_dict()으로 인해 딕셔너리로 전환할 수 있습니다.

bidict 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

pip3 install virtualenv
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

source env/bin/activate

가상환경을 폴더에서 활성화합니다.

pip install python-box

pip로 box를 설치합니다.

실습

from box import Box

box 패키지를 가져옵니다.

user_data = {
    "users": {
        "Kim": {
            "id": "realKimID",
            "email": "Kim@example.com",
            "friend": [{"name": "Lee", "status": "activated"},
                       {"name": "ahn", "status": "activated"}]
        },
        "Shin": {
            "id": "realShinID",
            "email": "Shin@example.com",
            "friend": [{"name": "Lee", "status": "deactivated"},
                       {"name": "ahn", "status": "deactivated"}]
        },
    }
}

user_box = Box(user_data)
print(user_box.users.Kim.email)

dict 타입을 box 객체로 만듭니다.

점 표기법으로 접근하면 하위 데이터를 참조할 수 있습니다.

users.Kim.email이라면 Kim@example.com가 반환됩니다.

print(user_box.users.Kim.friend[0])
print(user_box.users.Kim.friend[-1])

하위 데이터가 리스트인 경우에는 인덱스로도 접근할 수 있습니다.

user_box.users.Kim.friend.append({"name": "han", "status": "activated"})

하위 데이터가 리스트인 경우에는 추가하여 새로 Box를 반환합니다.

print(user_box.users.Kim.to_dict())
print(user_box.users.Kim == user_box.users.Kim.to_dict())

to_dict()은 인하여 일반적인 dict으로 변환할 수 있습니다.

하지만, 덕 타이핑으로 인해 같다고 인식됩니다.

test = Box({'hello': 10}, world=10)
print(test)

dict와 동일한 방법으로 Box 객체를 만들 수 있습니다.

frozen_box = Box(data={'frozen': 'box',}, frozen_box=True)
# frozen_box.frozen = 'Box'
# box.BoxError: Box is frozen

frozen_box로 값을 바꾸려면 BoxError가 생깁니다.

empty_box = Box(default_box=True)

print(empty_box.a.b.c)
empty_box.a.b.c.d = "h"
print(empty_box)

default_box로 생성하면 값을 여러 단계로 내려가서 대입할 수 있습니다.

camel_killer_box = Box(HelloWorld="HELLO, WORLD!", camel_killer_box=True)
print(camel_killer_box.hello_world)

camel_killer_box는 snake case로 검색되도록 할 수 있습니다.

box_of_order = Box(ordered_box=True)
box_of_order.c = 1
box_of_order.a = 2
box_of_order.d = 3
print(box_of_order.keys() == ['c', 'a', 'd'])

ordered_box는 키가 입력된 순서를 유지시킵니다.

from box import BoxList
box_list = BoxList({'item': x} for x in range(10))
print(box_list[5].item)

iterable한 변수를 넣어 연속적인 BoxList를 만들 수 있습니다.

from box import SBox
s_box = SBox(hello='world')
print(s_box.json)

일반적인 box에서 dict으로 변환하는 것보다 빠르게 json으로 변환할 수 있습니다.

Written on April 7, 2019