Python 多行缩进的代码样式';如果';陈述

Python 多行缩进的代码样式';如果';陈述,python,coding-style,indentation,code-readability,Python,Coding Style,Indentation,Code Readability,当缩进长if条件时,通常会执行如下操作(实际上,PyDev缩进如下): 但是,这会使if语句开始的块与if条件的最后一部分处于相同的缩进级别,这使得我认为它非常难看/难以读取,因为您不会立即看到块从何处开始 我想到的其他一些风格: if (collResv.repeatability is None or collResv.somethingElse): collResv.rejected = True collResv.rejectCompletely() 这

当缩进长if条件时,通常会执行如下操作(实际上,PyDev缩进如下):

但是,这会使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的倍数,而且它看起来是错误的,因为第二行的缩进比第一行中条件的开头少


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

我就是这么做的:

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

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

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

尽管如此,对于一个相对较短的条件,如您的具体示例中,我还是选择nosklo的解决方案-这里使用的额外语句更适合于更长的条件表达式。

这是一个间接的答案-不是直接回答样式问题,而是一般的实际答案,因此值得一提

我发现很少需要写多行条件句。这有两个因素:

  • 不要将代码换行到80列。PEP-8在这个问题上的建议既古老又有害;我们已经远远超过了80x25终端和编辑器不能合理处理包装的时代。100列是可以接受的,120列通常也是可以接受的
  • 如果条件变得如此之长以至于它们仍然需要包装,那么将一些逻辑从条件中移出并放入一个单独的表达式通常是合理的。这也有助于提高可读性
浏览我最近的项目,大约12kloc,只有一个条件足够长,需要包装;这个问题很少出现。如果您确实需要这样做,那么正如nosklo所说,将其单独缩进——正如您所注意到的,将其缩进到与下面的块相同的级别会让人感到困惑和难以阅读。

我有时会使用这个选项(尽管我并不完全相信它的可读性):

这样可能更具可读性:

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

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

现在,如果您愿意面对如此神圣的样式指南:-),您可以将操作员移动到下一行:

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

我不是很喜欢这个,事实上我发现你的原始语法很容易阅读,也不会花太多时间在缩进或换行上捣乱。

在这种情况下,我只需要做:

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

我会这样做的。将其缩进远处,以免混淆

if (collResv.repeatability is None or
                          collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()
PEP-8顾问就在这里

建议使用以下代码

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

这里所有先前建议的一个问题是,后续条件的逻辑运算符放在前一行。依我看,这使它不那么可读

if (collResv.repeatability is None or
  collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()
我建议将逻辑运算符与它附加到if语句的条件放在同一行

在我看来,这样更好

if (None == foo
        and None == bar
        or None == foo_bar):
除此之外:

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

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

这与任何Python风格的习惯用法都不一样——请不要这样做。是的,我应该注意,我只在简单的个人项目中使用Python,其他人永远都不必阅读。在我看来,无论使用何种语言,它都很可怕。这就像在C中只把
){
放在一个单独的行上。哈哈,我也这样做(在C#中)。我也不喜欢它,但我真的讨厌所有其他选项:|为什么在
collResv
上没有一个方法来做测试?事实上,你必须在非
self
的东西上做一个复合条件,这可能表明你需要重构。同样,为什么一个名为
的方法不能完全拒绝()
也在对象上设置
拒绝
属性?实际上,这只是一个例子。没有使用该名称的方法-我只是想要一些听起来有点合理的东西,在正文中有多行。通常我同意,尽管仍然有很好的理由坚持使用80列(眼睛喜欢宽度有限的文本;可以并排处理多个文件)@Oben:这是段落的格式原则,而不是代码。当你以一定的宽度包装英文段落时,每一行都在该宽度附近;这使得宽格式很难阅读,因为你的眼睛不断地扫描整个宽度。相比之下,当你以120列包装代码时,大多数行都要短得多;只有很少几行孤立的行较长。不会出现与过宽段落相关的可读性问题。我不觉得“并排”的案例有趣——两个80列编辑器甚至不适合我的24行“显示器的字体大小适中,而且在任何情况下,80列的换行都会使代码非常难看,这是不值得的。如果处于这种配置,人们可以接受一点编辑器换行,而不是期望其他人都压扁他们的代码。是的,有限的换行对于连续文本更为重要。不过,我认为(分别是我的眼睛)在代码中也喜欢这个原则——但显然这是个人的偏好。只要一个开发人员使用超长行,就会认为200个字符行或其他任何东西都不需要包装
if (None == foo and
        None == bar or
        None == foo_bar):