"空行"中的Python缩进

nis*_*isc 42 python coding-style idioms

哪个是首选("."表示空格)?

一个)

def foo():
    x = 1
    y = 2
....
    if True:
        bar()
Run Code Online (Sandbox Code Playgroud)

B)

def foo():
    x = 1
    y = 2

    if True:
        bar()
Run Code Online (Sandbox Code Playgroud)

我的直觉是B(这也是vim对我的影响),但我看到人们一直在使用A).是不是因为那里的大多数编辑都破了?

YOU*_*YOU 37

如果你使用A,你可以复制粘贴你的块在python shell中,B将得到意外的缩进错误.

  • 使用IPython时,应该使用'%paste`进行粘贴.它可以处理A或B. (4认同)
  • @ obesechicken13这些点应该是空格,它们只是被绘制出来的,以便您知道它们在那里。 (2认同)
  • 在使用git之前我一直直觉地使用A。当我开始使用 git 时,它会在 diff 中显示红色背景的空白行上的空格,导致我使用 B 来“修复”它。现在我遇到了 Python shell 被 B 绊倒的情况,并开始思考“也许 git 是错误的”关于这个”。所以,至少对于 Python 项目,我已经再次使用 A。为了平息我的差异,我现在使用“git-so-fancy”,并将“diff-so-fancy.markEmptyLines”设置为“false”,并且没有后悔。 (2认同)

Mic*_*yan 24

PEP 8似乎并没有在这个问题上明确,但关于"空行"的表述也有利于B.该PEP 8风格检查的解释(pep8.py)喜欢B和如果您使用警告; 但是,这两种变化都是合法的.我自己的观点是,由于Python在任何一种情况下都会成功地解释代码并不重要,并且试图强制执行它将会获得很多收益.我想如果你非常坚决地支持其中一个,你可以自动将一个转换为另一个.然而,试图手动修复所有这些线路将是一项艰巨的任务,真的不值得努力,恕我直言.

  • 有很好的论据支持A - 复制到shell中,B导致一些编辑的问题.除非A也存在问题,否则似乎是"A在某些情况下有帮助,无伤害"的情况,因此应该使用A. (10认同)
  • pep8 linter 在 A 上抱怨。`W293 空行包含空格`许多其他 python linter 也这样做 (2认同)

T .*_*T . 13

那条空行属于foo(),所以我认为A是最自然的.但我想这只是一个意见问题.


Zag*_*ags 13

为空行添加适当的缩进(问题中的样式A)极大地提高了启用显示空白的代码可读性,因为它可以更容易地查看空行后的代码是否是同一缩进块的一部分.

对于像Python这样没有结束语或近括号的语言,我很惊讶这不是PEP的一部分.强烈建议使用显示空格来编辑Python,以避免尾随空格和混合缩进.

比较阅读以下内容:

一个)

def foo():
....x = 1
....y = 2
....
....if True:
........bar()
Run Code Online (Sandbox Code Playgroud)

B)

def foo():
....x = 1
....y = 2

....if True:
........bar()
Run Code Online (Sandbox Code Playgroud)

A中,最后两行是其中一部分的更清楚foo.这在更高的压痕水平下更有用.

  • 我非常同意这个答案中的所有内容。最重要的是,如果您必须理解一些使用两个空格制表符的代码,您概述的问题会更糟! (2认同)

o0'*_*0'. 6

如果你使用B,TextMate会破坏块崩溃,我更喜欢A,因为它更"合乎逻辑".