dictionary packing, unpacking

nichol·2022년 6월 5일
0

Django

목록 보기
10/14

딕셔너리의 패킹과 언패킹

딕셔너리란 ?

  • dictionary, 사전 이라는 의미로 사전과같이 key를 이용해 value값을 찾는 형태
  • 구조는 {}중괄호 안에 key:value 형태로 {key:value} 로 작성됨.
a = {'a':'name'}

a['a'] = b

print(b)

>>> name

패킹과 언패킹

1. 패킹, packing

포장하다 담다라는 의미로 파이썬에서는 패킹을 뜻하는것이 두가지있는데 하나는 위치인자를 나타네는 ‘*’ 키워드인자를 나타네는 ‘**’ 으로 나타내는데

*는 여러개의 값을 동시에 받을수 있으며 이를 튜플로 반환한다.

**는 키값으로 인자들을 받을 수 있으며 이를 딕셔너리로 반환한다.

** 에 인자를 넣는방법은 key=value로

def kwargs(**kwargs):
	print(kwargs)

kwargs(a=1, b=2, c=3)

>>> {'a':1, 'b':2, 'c':3}

위와 같은 형태로 패킹이 된다.

2. 언패킹, unpaking

패킹의 반대말로

# django/views.py

127.0.0.1:8000/product?theme_id=1&is_new=1
# request로 query parametar를 통해 들어온다고 가정했을때.

filter_set = {}
            
	if theme_id:
		filter_set["product__theme_id"] = theme_id
 # theme_id 에 1이 들어가고 동시에 filter_set 딕셔너리형태로 저장된다.
 # filter_set = {"product__theme_id" : 1}

	if search:
		filter_set["name__contains"] = search

	if is_new: 
		filter_set["is_new"] = is_new
 # theme_id와 마찬가지로 
 # filter_set = {"product__theme_id" : 1, 'is_new' : 1}

products = Product.objects.filter(**filter_set)
# 딕셔너리를 **키워드 파라미터의 형식으로 인자를 받게되면 언패킹되며 
# products = Product.objects.filter("product__theme_id" = 1, 'is_new' = 1)

django에 쿼리파라미터로 언패킹을 사용하면 if문으로 분기하기 쉽다.

추가로 미리 키워드를 정의해놓고 .items 메소드를 이용한다면 if문을 줄일수 있다.

# django/views.py

127.0.0.1:8000/product?theme_id=1&is_new=1&sort=price
# request로 query parametar를 통해 들어온다고 가정했을때.
sort = request.GET.get('sort', '-id')

filter_set = {
                "theme_id" : "product__theme_id",
                "search"   : "name__contains",
                "is_new"   : "is_new"
            }

filter = {
	filter_set[key] : value for key, value in request.GET.items()if filter_set.get(key)
	}
# request.GET.items() = [(theme_id,1),(is_new,1)]  --> items 메소드는 key,value를 튜플로 만들어준다
# filter = {filter_set[theme_id] = 1, filter_set[is_new] = 1}
# filter = {"product__theme_id":1, "is_new":1}            
           
products = Product.objects.filter(**filter).order_by(sort)
# products = Product.objects.filter("product__theme_id"=1, "is_new"=1).order_by(price)
profile
WEB Developer

0개의 댓글