Python 在“空行”中缩进

问题描述 投票:0回答:11

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

A)

def foo():
    x = 1
    y = 2
....
    if True:
        bar()

B)

def foo():
    x = 1
    y = 2

    if True:
        bar()

我的直觉是 B(这也是 vim 为我所做的),但我看到人们一直在使用 A)。难道只是因为大多数编辑器都坏了?

python coding-style idioms
11个回答
53
投票

如果您使用A,您可以将您的块复制粘贴到Python shell中,B将出现意外的缩进错误。


28
投票

PEP 8 在这个问题上似乎并不清楚,尽管有关“空白行”的陈述可能会被解释为有利于 B。PEP 8 样式检查器 (pep8.py) 更喜欢 B 并在您使用时发出警告A;然而,这两种变体都是合法的。我自己的观点是,由于 Python 在任何一种情况下都会成功解释代码,因此这并不重要,并且尝试强制执行它会付出大量工作而收效甚微。我想如果你非常坚定地支持其中之一,你可以自动将其中一种转换为另一种。不过,尝试手动修复所有这些线路将是一项艰巨的任务,而且真的不值得付出努力,恕我直言。


22
投票

向空行添加适当的缩进(问题中的样式A)可以在启用显示空白的情况下极大地提高代码的可读性,因为它可以更轻松地查看空行之后的代码是否属于同一缩进块。

对于像 Python 这样没有结束语句或右括号的语言,我很惊讶这不是 PEP 的一部分。强烈建议在打开显示空格的情况下编辑 Python,以避免尾随空格和混合缩进。

比较阅读以下内容:

A)

def foo():
....x = 1
....y = 2
....
....if True:
........bar()

B)

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

....if True:
........bar()

A中,更清楚的是最后两行是

foo
的一部分。这在更高的压痕级别上更加有用。


14
投票

那个空行属于

foo()
,所以我认为
A
是最自然的。但我想这只是一个意见问题。


6
投票

如果您使用 B,TextMate 会破坏块折叠,无论如何我更喜欢 A,因为它更“合乎逻辑”。


4
投票

我在开源开发方面的经验是,永远不要在空行内留下空格。另外,永远不应该留下尾随空白。

这是编码礼仪的问题。


3
投票

我不一定会称第一个示例为“损坏”,因为我知道有些人讨厌在代码中向上或向下移动光标时光标“跳回”。例如。 Visual Studio(至少 2008)会自动防止这种情况发生,而无需在这些行上使用任何空白字符。


3
投票

B 是首选 - 即没有缩进。 PEP 8 说

避免在任何地方出现尾随空格。因为它通常是不可见的,所以可能会令人困惑 [...] 一些编辑器不保留它,并且许多项目(如 CPython 本身)都有拒绝它的预提交钩子。


1
投票

Emacs 对我来说是 B),但我真的认为这并不重要。 A) 意味着您可以在正确的缩进处添加一行,无需任何制表符。


1
投票

vi
隐式阻止 A 中的行为,因为
{
/
}
导航不再按预期工作。当您运行
git
时,
git diff
通过将其突出显示为红色来明确阻止它。我还认为,如果一行包含空格,它就不是空行。

出于这个原因,我强烈喜欢 B。没有什么比期望通过

{
动作跳过六行左右并最终成为班级定义的顶部更糟糕的了。


0
投票

除了@Zags 的回答。添加此作为答案以便能够附加图片。

如果您希望 PyCharm 使用“A”样式(在空行上保留缩进),请在设置中启用它:
文件|设置|编辑|代码风格|蟒蛇。在您选择的方案中,启用复选框“在空行上保留缩进”。

© www.soinside.com 2019 - 2024. All rights reserved.