ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL.74 삼항 연산자
    TIL/Python 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
Designed by Tistory.