“空行”中的 Python 缩进

Posted

技术标签:

【中文标题】“空行”中的 Python 缩进【英文标题】:Python indentation in "empty lines" 【发布时间】:2011-02-13 06:05:47 【问题描述】:

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

一)

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

B)

def foo():
    x = 1
    y = 2

    if True:
        bar()

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

【问题讨论】:

【参考方案1】:

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

避免在任何地方出现尾随空格。因为它通常是不可见的,所以可能会令人困惑:例如后跟空格和换行符的反斜杠不算作续行标记。一些编辑器不保留它,许多项目(如 CPython 本身)都有拒绝它的预提交钩子。

【讨论】:

【参考方案2】:

vi 隐含地阻止 A 中的行为,因为 / 导航不再按预期工作。 git 在运行 git diff 时通过以红色突出显示它来明确阻止它。我还要争辩说,如果一行包含空格,则它不是空行。

出于这个原因,我更喜欢 B。没有什么比期望跳过 6 行左右的行与 运动并最终在类 def 的顶部结束更糟糕的了。

【讨论】:

Git 只是通过突出显示空白差异来使其可见。使用git diff -bgit diff -w 抑制【参考方案3】:

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

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

比较阅读以下内容:

一)

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

B)

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

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

A中,最后两行是foo 的一部分,这一点要清楚得多。这在更高的缩进级别更有用。

【讨论】:

【参考方案4】:

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

【讨论】:

有趣。我刚刚用 EditPadPro 尝试过,它也使用缩进级别进行代码折叠,并且它可以很好地处理空行。【参考方案5】:

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

这是编码礼仪的问题。

【讨论】:

@Lo'oris 缩进对于代码是强制性的,但对于空行则不是。因此,空行中的任何空格都是不必要的。 这只是python的另一个设计缺陷。 “对于包含代码的行是强制性的但对于空行不是”是愚蠢的。 @Lohoris 我不同意。想象一下,如果调试一个空行导致完全不同的行为的语言是多么令人愤怒。如果不使用高级编辑器,甚至无法看到。 在一种重视意图的语言中,我希望程序员既能注意到这一点,又能拥有高级编辑器。 这个答案并没有添加任何有用的东西。由于在 Python 中缩进是强制性的,PEP8 也应该支持缩进的空行而不是“空”空行。恕我直言。【参考方案6】:

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

【讨论】:

有很多支持 A 的论据——复制到 shell,B 会导致一些编辑器出现问题。除非 A 也有问题,否则它似乎是“A 在某些情况下有帮助,没有任何伤害”的情况,因此应该使用 A。 s/^([\t ]+)([^\r\n]*)(\r?\n)\r?\n/\1\2\3\1\3/。搜索:捕获行首的制表符或空格,捕获任何非换行符(如果有),捕获换行符,查找换行符*。替换:缩进,行内容,换行,缩进,换行。警告:如果缩进行打开一个新块,正则表达式不会检测到这一点,而只是将下一行放在相同的缩进级别。 *我忽略了第二种换行格式,只是使用以前的换行格式来提高一致性 pep8 linter 抱怨 A.W293 blank line contains whitespace 和许多其他 python linter 也这样做 PEP 8 实际上很清楚,它说“避免在任何地方出现尾随空格”。我自己发布了an answer。 不确定是不是你的意思,但是很多编辑器支持自动修剪尾随空格,你可以很容易地在sed 中编写一个脚本来做同样的事情。【参考方案7】:

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

【讨论】:

我尝试在idlex中使用A,却得到了一个无效的语法错误。 @obesechicken13 这些点应该是空格,它们只是为了让你知道它们在那里而被绘制出来的。 在使用 IPython 时,您应该使用 %paste 代替粘贴。它可以处理 A 或 B。【参考方案8】:

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

【讨论】:

【参考方案9】:

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

【讨论】:

我同意它更自然,但我不同意这是一个见仁见智的问题。这是事实。【参考方案10】:

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

【讨论】:

以上是关于“空行”中的 Python 缩进的主要内容,如果未能解决你的问题,请参考以下文章

Python 常用PEP8规范

Python基础例子

python 数据结构

Python编程规范

python的元组及其书写规矩

Python的空行