39

当缩进长 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 的倍数,此外它看起来是错误的,因为第二行的缩进少于第一行条件开头的缩进。


所以,我的主要问题是:对于不需要过长行(即单行条件)的情况,是否有建议的缩进样式?如果不是,更喜欢这样的情况?

4

9 回答 9

26

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

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

虽然,对于您的具体示例中仍然相对较短的条件,我会选择nosklo的解决方案 - 这里使用的额外语句更适合更长的条件表达式。

于 2011-02-25T12:40:55.307 回答
15

这就是我所做的:

if (collResv.repeatability is None or
        collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()
于 2011-02-25T12:12:24.300 回答
12

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

我发现需要编写多行条件句的情况极为罕见。这有两个因素:

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

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

于 2011-02-25T12:42:56.290 回答
12

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

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

在我看来,这更好

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

比这个:

if (None == foo and
        None == bar or
        None == foo_bar):
于 2013-02-23T09:41:54.373 回答
3

我会这样做。保持缩进远离,以免混淆。

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)
于 2012-08-31T22:53:44.503 回答
3

PEP-8 在这里实际上似乎是矛盾的。虽然“最大行长”下的示例显示了括号和标准 4 字符缩进的使用,但“缩进”部分说,关于函数声明,“应使用进一步缩进来清楚地将其自身区分为续行。 ”。我不明白为什么这仅限于“def”而不是“if”。

于 2013-03-27T16:41:55.997 回答
0

我有时会使用的一个选项(尽管我并没有完全接受它的可读性):

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()
于 2011-02-25T13:03:36.597 回答
0

Pep-8 推荐您缩进原始示例的方式。

现在,如果您愿意面对如此神圣的风格指南 :-) 您可以将运算符移至下一行:

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

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

于 2011-02-25T13:16:27.047 回答
0

在这种情况下,我会简单地做:

if (collResv.repeatability is None or
    collResv.somethingElse):
    # do:
    collResv.rejected = True
    collResv.rejectCompletely()
于 2011-06-15T16:09:17.207 回答