评估复杂条件的Python代码
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
时可能会出错的事情。
这种做法是被广泛接受的,很多人都在使用。