如果语句过于嵌套?

时间:2018-11-21 05:57:11

标签: python django

我使用以下代码检查机票是否应包含折扣。现在有三个if语句,我想知道是否有更好的方法来减少嵌套?

ticket_price = current_ticket.display_price
    discount_code_session = request.session.get(request.event.discount_code_cookie(), None)

    if discount_code_session:
        discount_code = Discount.objects.filter(
            code=discount_code_session,
            event=request.event.pk
        ).first()

        # Make sure discount_code exists
        if discount_code:
            discounted_tickets = discount_code.tickets.all()

            # Why not discounted_tickets: If discounted_tickets empty, then the
            # discount code is valid for all tickets.
            if not discounted_tickets or current_ticket in discounted_tickets:

                discounted_price, original_price = (
                    discount_code.calculate_discounted_value(ticket_price)
                )

                ticket_price_dict = {
                    'original_price': original_price,
                    'discounted_price': discounted_price,
                }
                return ticket_price_dict
    return ticket_price

在@richflow注释之后,我现在有了下面的代码,我认为它更清楚:

ticket_price = current_ticket.display_price
    discount_code_session = request.session.get(request.event.discount_code_cookie(), None)

    if not discount_code_session:
        return ticket_price

    discount_code = Discount.objects.filter(
        code=discount_code_session,
        event=request.event.pk
    ).first()

    # Make sure discount_code exists
    if not discount_code:
        return ticket_price

    discounted_tickets = discount_code.tickets.all()

    # Why not discounted_tickets: If discounted_tickets empty, then the
    # discount code is valid for all tickets.
    if not discounted_tickets or current_ticket in discounted_tickets:

        discounted_price, original_price = (
            discount_code.calculate_discounted_value(ticket_price)
        )

        ticket_price_dict = {
            'original_price': original_price,
            'discounted_price': discounted_price,
        }
        return ticket_price_dict
    else:
        return ticket_price

1 个答案:

答案 0 :(得分:1)

深层嵌套的if是一种代码味道,尽管不一定是错误的。

通常,您希望通过条件检查快速失败,而不是嵌套它们:

discount_code_session = xxx
if not discount_code_session:
  return ticket_price

discount_code = yyy
if not discount_code:
  return ticket_price

if discounted_tickets or current_ticket not in discounted_tickets:
  return ticket_price

#otherwise
do_the_things_here

您也可以尝试在code review上发帖,因为这可能是解决此类问题的好地方。

修改

这确实进入了代码审查领域,但要充实一个更完整的答案,这是this book作为Python指南必须说的(与您要问的内容有关):

  

在函数中返回值的主要情况有两种... [一种是]   错误情况...或任何其他情况   函数无法完成其计算的原因,或   任务。

     

...在这种情况下   最好在检测到错误的上下文后尽快返回。   这将有助于扁平化函数的结构:所有代码   由于错误返回语句后可以假定条件   被满足以进一步计算功能的主要结果...

     

但是,当一个函数的正常状态有多个主退出点时   当然,调试返回的结果变得很困难,因此可能   最好保留一个出口点...

我赞成第一个论点。其他人选择第二个。阅读whole thing,因为它提供了更多详细信息来帮助您做出决定。