评估复杂条件的Python代码

2 投票
3 回答
650 浏览
提问于 2025-04-16 10:59
show_prev_btn = (len(sessions) > 0 and (sessions[0].pk == \
    Session.objects.filter(user=request.user).first().pk))

我有一个布尔值在计算。Sessions 是一个列表,如果它里面没有任何元素,sessions[0] 就会出错。幸运的是,我觉得我可以在计算之前通过检查 len(sessions) > 0 来捕捉这个问题。

这个方法在我本地的开发机器上是有效的,但这样做算不算好习惯?还是应该把这些条件放在里面嵌套起来?

3 个回答

0

要从一个旧问题中复制内容,可以试试这个方法。这个写法更容易理解,虽然两者之间的区别其实是随意的。

sessions[0].pk == Session.objects.filter(user=request.user).first().pk) if len(sessions) else False
0

把条件嵌套起来的好处是,在这个特定的情况下,它可能会让代码看起来更清晰一些(因为减少了每行的长度)。

虽然我觉得这两种写法都是不错的选择,但这更多是个人喜好和代码风格的问题(我怀疑如果有性能差异,也不会有太大影响)。

5

在Python中,and这个操作符是用一种叫做短路求值的方式来工作的。也就是说,如果你有这样的表达式:

a() and b()

首先会执行a()这个函数。只有当它返回True时,才会执行b()这个函数。如果a()返回False,那么b()就不会被执行,这样你可以在b()里面做一些如果a()False时可能会出错的事情。

这种做法是被广泛接受的,很多人都在使用。

撰写回答