TIL/Python
TIL.74 삼항 연산자
codermun
2020. 12. 21. 22:24
728x90
반응형
프로젝트 진행 간 if문으로 가지치는 방법이 싫어 찾아봤던 삼항 연사자를 간략히 정리해보자
1. 삼항 연산자(Ternary operators)
# 참인경우 값 if 조건 else 거짓인경우 값
- 연산 대상의 개수에 따라 연산자를 분리하면 단항 연산자, 이항 연산자, 삼항 연산자로 분리 합니다.
- 단항 연산자는 부호(+, -), not 등이 있으며 +, -, *, / .... 등 대부분의 연산자가 이항 연산자 입니다.
- 삼항 연산자는 1개가 존재 합니다.
아래와 같이 QueryString 요청에 "P"가 포함될 경우에 따라
앞의 식을 실행하지 뒤의 식을 실행할지 정하는 식으로 사용할 수 있다.
# A = apple / B = banana
a_name = request.GET.get('P', None)
product = Product.object.get(name=a_name)if a_name=='A' else Product.objects.get(name=b_name)
아래와 같은 QueryString 요청으로 각기 다른 식을 적용해 각기 다른제품을 볼 수 있다
10.xxxxxxxx:8000/product?P=A
# apple
10.xxxxxxxx:8000/product?P=B
# banana
삼항연산자를 알아보면서 이를 왜 알아봤는지 자세한 이유를 복기해보자.
(아래와 같은 이유로 삼항 연산자를 검색하고 학습하게 되었지만 결론적으로는 이를 적용하지 않는 로직을 구현하였다.)
이유는 이미 ProductlistView에 최신/가격/인기도/리뷰많은순/평점높은순 등을 모두 RESTfulAPI로 구현해놓은 상태에서
코드가 깔끔해지지 않아 보이나는 생각에 DetailView에서 패스파라미터와 검색기능을 함께 구현하려고 하였다.
아래와 같이 DetailView에 작성해도 검색기능을 구현할 수 는 있지만 크게 2가지 문제가 있다고 생각한다.
1. Django convention에 어긋난다.
2. Request의 불필요한 요청이 강제적으로 포함된다.
(아래와 같이 검색기능을 사용할때도 <int>를 꼭 붙혀줘야하는 번거로움이 있다.)
10.xxxxxxxx:8000/product/1
# path parameter
10.xxxxxxxx:8000/product/1?search=price
# search 기능
10.xxxxxxxx:8000/product/?search=price
# search 불가능
10.xxxxxxxx:8000/product?search=price
# search 불가능
class ProductDetailView(View):
def get(self, request, product_id):
try:
product = Product.objects.get(id=product_id)
product_detail = {
'id' : product.id,
'product_category': product.category.name,
'product_menu' : product.category.menu.name,
'product_name' : product.name,
'price' : product.price,
'created_time' : product.created_at,
'image' : product.image_set.get().image_url,
'discount' : product.discount.rate,
'stock' : product.is_in_stock,
}
return JsonResponse({'product' :product_detail}, status=200)
except Product.DoesNotExist:
return JsonResponse({'MESSAGE' : 'NO_PRODUCT'}, status=409)
결과적으로 삼항연산자를 적용하지 않았지만 굉장히 유용한 python 개념을 알게된 계기가 되었다.
그리고 검색 기능은 상품 리스트 뷰에 포함시키는것이 컨밴션이라는 것을 잊지말자!
728x90
반응형