“空行”中的Python缩进

时间:2010-04-28 08:53:54

标签: python coding-style idioms

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

A)

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

B)

def foo():
    x = 1
    y = 2

    if True:
        bar()

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

10 个答案:

答案 0 :(得分:33)

如果你使用 A ,你可以复制粘贴你的块在python shell中, B 会出现意外的缩进错误。

答案 1 :(得分:22)

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

答案 2 :(得分:11)

该空行属于foo(),因此我认为A是最自然的。但我想这只是一个意见问题。

答案 3 :(得分:10)

为空行添加适当的缩进(问题中的样式 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的一部分更为清晰。这在更高的压痕水平下更有用。

答案 4 :(得分:6)

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

答案 5 :(得分:3)

我不一定会把第一个例子叫做“破碎”,因为我知道当代码中向上或向下移动光标时光标“向后跳”时有些人讨厌它。例如。 Visual Studio(至少2008年)会在不使用这些行上的任何空白字符的情况下自动防止这种情况发生。

答案 6 :(得分:3)

我在开源开发方面的经验是,永远不要将空白留在空白行中。也不应该留下尾随的空白区域。

这是编码礼仪的问题。

答案 7 :(得分:1)

Emacs为我做了B),但我认为这并不重要。 A)意味着您可以在没有任何标签的情况下在正确的缩进处添加一行。

答案 8 :(得分:1)

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

在任何地方都避免尾随空格。由于它通常是不可见的,因此可能会造成混淆:反斜杠后跟一个空格和一个换行符不算作行继续标记。一些编辑器没有保留它,并且许多项目(例如CPython本身)都有预先提交的钩子来拒绝它。

答案 9 :(得分:0)

vi隐含地阻止A中的行为,因为{ / }导航不再按预期工作。 git运行git diff时,{会以红色突出显示,从而明确地阻止它。我还认为,如果一行包含空格,则不是空行。

出于这个原因,我非常喜欢B.没有什么比期望用-i动作跳过6行左右并最终在类def的顶部更糟糕了。