缩进多行'if'语句的代码风格?

时间:2011-02-25 12:11:18

标签: python coding-style indentation code-readability

如果在条件下缩进很长时间,你通常会做这样的事情(实际上,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 个答案:

答案 0 :(得分:22)

我经常通过在自己的陈述中计算条件来解决这个问题:

condition = (collResv.repeatability is None or
             collResv.somethingElse)
if condition:
    collResv.rejected = True
    collResv.rejectCompletely()

尽管如此,对于一个仍然相对较短的情况,如你的具体例子,我会选择 nosklo 的解决方案 - 这里使用的额外语句更适合更长的条件表达式。

答案 1 :(得分:13)

这就是我的所作所为:

if (collResv.repeatability is None or
        collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

答案 2 :(得分:10)

此前所有建议的一个问题是后续条件的逻辑运算符放在前一行。 Imo,这使得它的可读性降低。

我建议将逻辑运算符放在与if语句附加的条件相同的行上。

在我看来,这是更好的

if (None == foo
        and None == bar
        or None == foo_bar):

比这个:

if (None == foo and
        None == bar or
        None == foo_bar):

答案 3 :(得分:9)

这是一个间接的答案 - 不直接回答风格问题,但这是一般的实际答案,所以值得一提。

我发现需要编写多行条件非常罕见。这有两个因素:

  • 不要将代码包装在80列。 PEP-8关于这个问题的建议是古老而有害的;我们已经过了80x25终端和编辑器的时代,这些终端和编辑器无法合理地处理包装。 100列很好,120也是可以接受的。
  • 如果条件变得太长以至于它们仍然需要换行,那么将一些逻辑移出条件并进入单独的表达式通常是合理的。这也有助于提高可读性。

通过我最近的项目,大约12kloc,只有一个条件足够长,需要包装;这个问题很少出现。如果你确实需要这样做,那么就像nosklo所说的那样,单独缩进它 - 正如你所注意到的那样,将它缩进到与它下面的块相同的水平是令人困惑和难以阅读的。

答案 4 :(得分:3)

PEP-8在这里看起来实际上是矛盾的。虽然“最大行长度”下的示例显示了括号的使用和标准的4字符缩进,但“缩进”部分表示,就函数声明而言,“应使用进一步的缩进来清楚地将自己区分为连续行。 ”。我不明白为什么这只会被限制为“def”而不是“if”。

答案 5 :(得分:2)

我会这样做。保持它远远不会混淆。

if (collResv.repeatability is None or
                          collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

PEP-8建议就在这里。

http://www.python.org/dev/peps/pep-0008/#indentation

建议下面的代码

# Aligned with opening delimiter
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# More indentation included to distinguish this from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

不建议使用以下代码

# Arguments on first line forbidden when not using vertical alignment
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# Further indentation required as indentation is not distinguishable
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

答案 6 :(得分:0)

Pep-8建议您缩进原始示例的方式。

现在如果你愿意面对那些神圣的风格指南飞行:-)你可以将操作员移到下一行:

if (collResv.repeatability is None
    or collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()

我不是真的很喜欢这个,我实际上发现你的原始语法相当容易阅读,并且不会花太多时间用缩进或换行符。

答案 7 :(得分:0)

在这种情况下,我只会这样做:

if (collResv.repeatability is None or
    collResv.somethingElse):
    # do:
    collResv.rejected = True
    collResv.rejectCompletely()

答案 8 :(得分:-1)

我有时会使用的选项(虽然我的可读性并不完全出售):

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()