多行'if'语句的缩进代码风格是什么?
当你需要给很长的 if 条件加缩进时,通常会这样做(实际上,PyDev 就是这么缩进的):
if (collResv.repeatability is None or
collResv.somethingElse):
collResv.rejected = True
collResv.rejectCompletely()
不过,这样做会让 if 语句开始的代码块和 if 条件的最后一部分在同一缩进级别,这让我觉得看起来很丑,也很难读,因为你不能马上看到代码块是从哪里开始的。
我想过一些其他的风格:
if (collResv.repeatability is None or
collResv.somethingElse):
collResv.rejected = True
collResv.rejectCompletely()
这种方式看起来有点不一致,因为第二行的缩进比第一行多很多,但还是能读懂。
if (collResv.repeatability is None or
collResv.somethingElse):
collResv.rejected = True
collResv.rejectCompletely()
这种方式比第一个例子更容易阅读,但缩进就不是 4 的倍数了,而且看起来也不太对,因为第二行的缩进比第一行条件的开始要少。
所以,我主要想问的是:对于这种情况,有没有推荐的缩进风格,能避免过长的行(也就是单行条件)?如果没有,你自己在这种情况下喜欢用什么样的方式呢?
9 个回答
18
我做的是这样的:
if (collResv.repeatability is None or
collResv.somethingElse):
collResv.rejected = True
collResv.rejectCompletely()
29
我经常通过在自己的语句中计算条件来解决这个问题:
condition = (collResv.repeatability is None or
collResv.somethingElse)
if condition:
collResv.rejected = True
collResv.rejectCompletely()
不过,对于你这个具体例子中相对较短的条件,我会选择nosklo的解决方案——这里使用的额外语句更适合处理更长的条件表达式。
13
这不是直接回答风格问题,而是给出一个更实用的建议,所以值得提一下。
我发现需要写多行条件判断的情况非常少。主要有两个原因:
- 不要把代码限制在80列。PEP-8对这个问题的建议已经过时且有害;我们早就不再使用80x25的终端和那些处理不了换行的编辑器了。100列是可以的,120列通常也没问题。
- 如果条件判断变得很长,还是需要换行,那通常可以把一些逻辑移到条件外面,放到一个单独的表达式中。这样做也有助于提高可读性。
在我最近的项目中,代码大约有12000行,只有一个条件判断长到需要换行;这种情况真的很少见。如果你确实需要这样做,正如nosklo所说,要单独缩进——你也注意到了,把它缩进到和下面的代码块同一层级会让人困惑,难以阅读。