为什么Python pep-8强烈推荐使用缩进标签进行缩进?

我在Stack Overflow和PEP 8上看到,build议只在Python程序中使用空格来缩进。 我可以理解需要一致的缩进,我感到痛苦。

是否有空间优先的基本原因? 我会认为,标签是更容易处理。

答案就在PEP中给出了[编辑:这段文字在2013年被编辑出来]。 我引用:

缩进Python 最stream行的方式是只用空格。

你还需要什么其他的根本原因?

说得不那么直白:还要考虑第一段中所述的PEP的范围:

本文档给出了Python代码组成的编码约定,包括Python主发行版中的标准库。

其目的是使所有在官方python发行版中的代码格式一致(我希望我们可以认同这是普遍的Good Thing™)。

由于单个程序员的空间和选项卡之间的决定是a)真正的趣味问题,b)通过技术手段(编辑器,转换脚本等)很容易处理,所以有一个明确的方法来结束所有的讨论:select一个。

圭多是一个可以select的人。 他甚至不必说出理由,但他仍然通过提及经验数据。

除此以外,你可以把这个PEP作为推荐,或者你可以忽略它 – 你的select,你的团队或者你的团队领导。

但是,如果我可以给你一个build议:不要mix'em 😉 [编辑:混合制表符和空格不再是一个选项。]

好吧,似乎每个人都强烈偏向于空间。 我只使用标签。 我很清楚为什么。

标签实际上是一个很酷的发明,是空间之后 。 它允许你缩进而不用推空间数百万次或者使用假选项卡(产生空格)。

我真的不明白为什么每个人都在区分使用制表符。 这就像老年人歧视年轻人select更新的更高效的技术,抱怨脉冲拨号在每个电话上工作 ,而不仅仅是这些新奇的新手机 。 “audio拨号不适用于每个电话,这就是为什么它是错误的”。

你的编辑器无法正确处理标签? 那么,得到一个现代编辑。 可能有时间,我们现在是在21世纪,编辑是一个高科技复杂的软件时代已经过去了。 我们现在已经有很多编辑可供select,所有支持标签的应用都很好。 另外,你可以定义一个标签应该是多less,一个你不能用空格做的事情。 无法看到标签? 这是什么争论? 那么,你不能看到空格!

我可以大胆地build议找一个更好的编辑器吗? 这些高科技产品之一,大约十年前已经发布了,那些显示无形的angular色 ? (讽刺)

使用空格会导致更多的删除和格式化工作。 这就是为什么(和所有其他知道这一点,并同意我的人)使用Python的标签。

混合选项卡和空格是一个不容否认的。 这是一个混乱,无法工作。

我个人不同意标签上的空格。 对我来说,选项卡是一个文档布局字符/机制,而空格是代码中的内容或命令之间的划定。

我不得不同意吉姆的评论,标签不是真正的问题,而是人和他们想要混合标签和空格。

那就是说,我强迫自己为了约定而使用空格。 我重视个人偏好的一致性。

空格的原因是选项卡是可选的。 空格是标点符号中实际最小的公分母。

每个像样的文本编辑器都有一个“用空格replace标签”,许多人使用它。 但并不总是。

虽然一些文本编辑器可能会用选项卡replace空格,但这种情况非常罕见。

底线 。 空间不能出错。 您可能会出现选项卡错误。 所以不要使用制表符并减less错误的风险。

标签的问题在于它们是不可见的,人们永远不会同意标签的宽度。 当你混合使用制表符和空格时,你将tabstops设置为除Python之外的东西(每8个空格使用一个tabstops),你将会看到与Python不同的布局。 而且因为布局决定了区块,你会看到不同的逻辑。 它导致微妙的错误。

如果你坚持反对PEP 8并使用制表符 – 或者更糟糕的是,混合制表符和空格 – 至less总是用'-tt'参数运行python,这会使缩进不一致 (有时是一个制表符,有时候是一个缩进级别)出错。 另外,如果可能,请将您的编辑器设置为不同的显示选项 但真的,最好的办法是不使用制表符,句号。

缩进的主要问题发生在混合制表符和空格时。 显然,这并不能告诉你你应该select哪一个,但是推荐一个也是一个很好的理由,即使你通过掷硬币来挑选它。

但是,恕我直言,有一些小的理由偏好空间超过标签:

  • 不同的工具。 有时代码会显示在程序员的编辑器之外。 例如。 发布到新闻组或论坛。 空格通常比这里的标签要好 – 在任何地方,空格都会被打乱,标签也会如此,反之则不然。

  • 程序员看到来源不同。 这是非常主观的 – 它或者是标签的主要好处,或者是根据你所处的位置来避免它们的原因。 另外,开发人员可以使用自己喜欢的缩进来查看源代码,所以喜欢2-space缩进的开发人员可以和同一个源代码的8位开发人员一起工作,仍然可以看到它。 不利的一面是,这有一些影响 – 有些人喜欢8-space,因为它提供了非常明显的反馈,他们嵌套太深了 – 他们可能会看到代码检查由2压头不断包装在他们的编辑器。 让每个开发人员都看到代码的方式相同,导致线长度和其他事情的一致性更高。

  • 续行缩进。 有时候你想缩进一行来表示它是从前一个进行的。 例如。

    def foo(): x = some_function_with_lots_of_args(foo, bar, baz, xyzzy, blah) 

    如果使用制表符,那么没有办法将其与编辑器中使用不同制表符的用户alignment,而无需混合使用空格和制表符。 这有效地杀死了上述的好处。

显然,这是一个深深的宗教问题,编程是困扰着。 最重要的问题是,我们应该select一个 – 即使那不是你喜欢的那个。 有时我认为重要的缩进的最大优势是,至less我们是免费的支架放置flamewars。

也值得一读的是Jamie Zawinski关于这个问题的文章。

请注意,标签的使用混淆了PEP 8的另一个方面:

将所有行限制为最多79个字符。

假设,假设你使用2的制表符宽度,并使用8的制表符宽度。你写所有的代码,让你的最长的行数达到79个字符,然后我开始处理你的文件。 现在我有难以阅读的代码,因为(正如PEP所述):

大多数工具的默认包装会破坏代码的可视化结构

如果我们全部使用4个空格,它总是一样的。 编辑者可以支持80个字符宽度的任何人都可以舒适地阅读代码。 注意:80个字符的限制本身就是一场神圣的战争,所以我们不要在这里开始。

任何不吸引人的编辑器应该有一个使用空格的选项,就像它们是制表符(插入和删除)一样,所以实际上不应该是一个有效的参数。

问题的答案是:PEP-8想要提出build议,并决定,由于空间更受欢迎,它会强烈推荐空格而不是标签。


关于PEP-8的说明

PEP-8说“每个缩进级别使用4个空格”。
它清楚地表明这是标准build议。

“对于你不想搞乱的旧代码,你可以继续使用8-space选项卡。
很明显,在某些情况下可以使用制表符。

不要混合标签和空格。
这是一个明确的禁止混合 – 我想我们都同意这一点。 Python可以检测到这个,经常窒息。 使用-tt参数使得这是一个明确的错误。

“缩进Python最stream行的方式是只用空格。 第二个最stream行的方式是只有标签。
这清楚地表明两者都被使用。 只是要超清晰:你仍然不应该在同一个文件中混合空格和制表符。

对于新项目,强烈build议使用空格。
这是一个明确的build议,是一个强大的build议,但不是禁止标签。


我在PEP-8中找不到自己的问题的一个很好的答案。 我使用的标签,我用历史上其他语言使用。 Python独占使用标签接受源代码。 这对我来说足够了。

我以为我会去空间工作。 在我的编辑器中,我configuration了一个文件types来专门使用空格,所以如果按tab,它会插入4个空格。 如果我按下标签太多次,我必须删除空格! Arrgh! 删除标签的四倍! 我的编辑器不能告诉我使用4个空格来缩进(尽pipeAN编辑器可能会这样做),并且显然坚持每次删除一个空格。

在阅读缩进时,不能告诉Python将制表符看作是n个空格吗? 如果我们可以同意每个缩进4个空格和每个标签4个空格,并允许Python接受这个,那么就没有问题了。
我们应该find双赢的解决问题的办法。

JWZ最好说 :

当[人们]阅读代码时,当他们完成新代码的编写时,他们会关心当新的范围(或sexpr或其他)打开时,代码倾向于缩进的屏幕列数。

…我的观点是,解决技术问题的最好方法是强制ASCII#9 TAB字符永远不会出现在磁盘文件中:在将行写入磁盘之前,将编辑器编程为将TAB扩展到适当数量的空格。 ..

…这里假设你从不在实际显着的地方使用制表符,比如在string或者字符常量中,但是我从来没有这样做:当它是一个制表符的时候,我总是用'\ t'代替。

我一直在我的代码中使用选项卡。 也就是说,我最近发现了一个使用空格的理由:在我的诺基亚N900互联网平板电脑上开发时,我现在有一个没有标签键的键盘。 这迫使我复制和粘贴标签或重新写我的代码与空格。 我遇到了与其他手机相同的问题。 当然,这不是Python的标准用法,但要记住。

由于python依靠缩进来识别程序结构,因此需要一个明确的识别身份的方法。 这是select空格或制表符的原因。

然而,python也有一个强有力的哲学,就是只有一种办法,所以应该有一个官方的推荐方法来做缩进。

编辑器将空格和制表符都作为缩进来处理,这是独特的挑战。 标签本身的处理在编辑器甚至用户设置中是不统一的。 由于空间是不可configuration的,所以它们提供了更合理的select,因为它们保证了结果看起来每个地方都是一样的。

我可以通过制表符来分辨空间的最重要的优点是,许多程序员和项目为源代码使用了一定数量的列,如果某人提交的tabstop设置为2个空格,并且项目使用4个空格作为更改对于其他人的编辑窗口来说,长线会太长。 我同意选项卡更容易处理,但我认为空间更容易协作,这对于像Python这样的大型开源项目非常重要。

你可以吃你的蛋糕,吃它。 设置你的编辑器自动将选项卡扩展到空格。

(这将是:set expandtab在Vim中:set expandtab

除了所有已经提到的其他原因(一致性,从不混合空格和制表符等),我相信还有更多的理由要注意4空间惯例。 这些只适用于Python(也可能是其他语言缩进有意义)。 其他语言的标签可能会更好,具体取决于个人偏好。

  1. 如果一个编辑器没有显示标签页(根据configuration不同,会出现这种情况),另外一个作者可能会认为你的代码使用了4个空格,几乎所有的Python代码都是公开的。 如果同一个编辑器的标签宽度为4,那么可能会发生令人讨厌的事情 – 至less,这个可怜的人会因为坚持公约而很容易避免的缩进问题而失去时间。 所以对我来说,首要的原因就是避免一致性的错误。

  2. 重新考虑哪个更好,标签或空间的问题,应该问问标签的优点是什么; 我见过很多赞扬选项卡的post,但很less有引人注目的论点。 像emacs,vi(m),kate等好的编辑器会根据代码的语义做适当的缩进 – 即使没有制表符; 相同的编辑可以很容易地configuration为在后退等的unindent

  3. 有些人在决定代码的外观/布局方面有很大的自由, 其他人则认为这种自由是一致的 Python通过规定用于块的缩进等手段来大幅度地降低了这种自由度。这可能被看作是一个bug或一个特性,但是它select了Python。 就我个人而言,我喜欢这种一致性 – 当开始在一个新项目上编码时,至less布局已经接近我以前的习惯,所以阅读起来相当容易。 几乎总是。

  4. 使用空格缩进允许“布局技巧”,这可能有助于理解代码; PEP8列出了这些例子; 例如。

     foo = long_function_name(var_one, var_two, var_three, var_four) # the same for lists a_long_list = [1, 2, # ... 79] # or dictionaries a_dict = {"a_key": "a_value", "another_key": "another_value"} 

    当然,上面也可以写得很好

     foo = long_function_name( var_one, var_two, var_three, var_four) # the same for lists a_long_list = [ 1, 2, # ... 79] # or dictionaries a_dict = { "a_key": "a_value", "another_key": "another_value"} 

    然而,后者需要更多的代码行,有时认为更less的行会更好(在单个屏幕上你可以得到更多的行)。 但是如果你喜欢alignment,空间(最好由一个好的编辑器协助)在某种意义上给你比Python更多的自由。 [呃,我猜一些编辑允许你做同样的w / tab; – 但是有空格,所有的都是…]

  5. 回到其他人所做的相同的论点–PEP 8规定(好的,强烈推荐)空格。 如果来到只使用标签的项目,当然,你没有什么select。 但是由于PEP 8约定的build立,几乎所有的Python程序员都习惯了这种风格。 这使得在大多数程序员所接受的风格上find共识变得容易得多,并且个人对风格的认同可能会非常困难。

  6. 有助于强化风格的工具通常不需要额外的努力即可了解PEP 8。 这不是一个很好的理由,但它是开箱即用的事情。

制表符的普遍问题是它们在不同的环境中可以有不同的表示方式。
在给定的编辑器中,选项卡可能是8个空格,也可能是2个。
在一些编辑器中,你可以控制这个,而在另一些编辑器中则不能。

选项卡的另一个问题是如何在打印输出中表示它们。 我相信大多数打印机将标签解释为8个空格。

有了空格,毫无疑问。 一切将按照作者的意图排列。

关于Jim和Thomas Wouters在评论中的讨论。

问题是…因为制表符和空格的宽度都是可以改变的 – 既然程序员不能同意这两个宽度,为什么制表符要承担责任。

我同意Jim的观点 – 标签本身并不是邪恶的。 但是有一个问题…

使用空格,我可以控制“我自己的代码”在世界上每个编辑器中的外观。 如果我使用4个空格,那么无论您使用何种编辑器打开我的代码,它都会与左边距具有相同的距离。 使用选项卡,我处于编辑器的制表符宽度设置的摆布 – 即使是我自己的代码。 我不喜欢那样。

因此,即使空间不能保证一致性,他们至less可以让你更多地控制自己的OWN代码的外观 – 这是标签所不能做到的。

我认为这不是编程人员编写代码的一致性 – 而是编辑人员显示代码的一致性 – 这些空间使得实现(和施加)更容易。