我使用以下代码检查机票是否应包含折扣。现在有三个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
答案 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,因为它提供了更多详细信息来帮助您做出决定。