代码之家  ›  专栏  ›  技术社区  ›  quamrana Ryuzaki L

为什么python pep-8强烈推荐使用空格而不是制表符进行缩进?

  •  129
  • quamrana Ryuzaki L  · 技术社区  · 16 年前

    我看到在堆栈溢出和 PEP 8 建议只在Python程序中使用空格进行缩进。我能理解持续压痕的必要性,我感到了疼痛。

    是否存在优先选择空间的根本原因?我本以为标签更容易使用。

    16 回复  |  直到 7 年前
        1
  •  99
  •   user3850    7 年前

    答案就在政治公众人物会议上给出了[编辑:这篇文章已经在 2013 ]我引述:

    这个 最受欢迎 缩排python的方法只使用空格。

    你还需要什么其他的潜在原因?

    更直截了当地说:还应考虑第一段中所述的政治公众人物的范围:

    本文给出了包含主python发行版中标准库的python代码的编码约定。

    其目的是 所有进入官方python发行版的代码 格式一致(我希望我们能一致认为这是一个普遍的好东西)。

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

    吉多是唯一的选择。他甚至不必给出理由,但他还是参考了经验数据。

    对于所有其他目的,您可以将此PEP作为建议,或者忽略它——您的选择、您的团队或您的团队领导。

    但是,如果我可以给你一个建议:不要混合它们;-)[ed:混合制表符和空格不再是一个选项。]

        2
  •  76
  •   Nayuki James111    9 年前

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

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

    我真的不明白为什么每个人都歧视标签的使用。 这很像老年人歧视年轻人,因为他们选择了一种新的更有效的技术,并且抱怨脉冲拨号工作正常。 每电话 不仅仅是这些新奇的新产品。”单音拨号并不适用于每一部电话,这就是为什么它是错误的”。

    您的编辑器无法正确处理选项卡?嗯,得到一个 现代的 编辑。也许是该死的时候,我们现在是在21世纪,而当一个编辑是一个高科技复杂的软件的时代已经过去很久了。我们现在有很多编辑器可供选择,所有支持选项卡的编辑器都很好。此外,您还可以定义选项卡的大小,这是您不能用空格操作的。 看不到标签?这是什么理由?好吧,你也看不到空间!

    我能大胆地建议找一个更好的编辑吗?其中一个是10年前发布的高科技产品, 显示不可见字符 ?(挖苦)

    使用空格会导致更多的删除和格式化工作。这就是为什么(以及所有其他知道这一点并同意我的人)将选项卡用于Python的原因。

    把标签和空格混合在一起是一个没有争议的问题。这真是一团糟,永远不会奏效。

        3
  •  36
  •   Soviut    15 年前

    我个人不同意标签上的空格。对我来说,标签是一种文档布局字符/机制,而在代码的情况下,空格用于内容或命令之间的描述。

    我必须同意吉姆的意见,即标签并不是真正的问题,而是人们以及他们希望如何混合标签和空格。

    也就是说,我强迫自己为了约定而使用空间。我重视一致性胜过个人偏好。

        4
  •  27
  •   S.Lott    14 年前

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

    每一个像样的文本编辑器都有一个“用空格替换制表符”,许多人都使用这个。但并非总是如此。

    虽然有些文本编辑器可能会用制表符替换一组空格,但这是非常罕见的。

    底线 . 你不能在空格上出错。你 可以 标签出错。所以不要使用标签,减少出错的风险。

        5
  •  25
  •   Thomas Wouters    16 年前

    标签的问题在于它们是不可见的,人们永远无法在标签的宽度上达成一致。当混合使用制表符和空格时,如果将tabstop设置为python之外的某个值(每8个空格使用tabstop),则会看到代码的布局与python看到的不同。因为布局决定了块,所以您将看到不同的逻辑。它会导致细微的错误。

    如果您坚持不使用pep 8,并且使用制表符——或者更糟的是,混合制表符和空格——至少总是使用“-tt”参数运行python,这使得 不一致的 缩进(有时是制表符,有时是同一缩进级别的空格)错误。此外,如果可能,请将编辑器设置为以不同的方式显示选项卡。但实际上,最好的方法不是使用制表符,句号。

        6
  •  22
  •   Brian    16 年前

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

    但是,imho有一些次要的理由支持空格而不是制表符:

    • 不同的工具。有时代码会显示在程序员编辑器之外。张贴到新闻组或论坛上。这里的空格通常比制表符做得更好——在任何地方空格都会被破坏,制表符也会,但反之亦然。

    • 程序员对源代码的看法不同。这是非常主观的——它要么是选项卡的主要优点,要么是根据您所处的位置来避免它们的原因。另一方面,开发人员可以使用自己喜欢的缩进查看源代码,因此,喜欢2空间缩进的开发人员可以在同一个源代码上使用8空间开发人员,并且仍然可以按自己喜欢的方式查看它。缺点是,这会产生一些影响-有些人喜欢8-space,因为它提供了非常明显的反馈,认为它们嵌套得太深-他们可能会看到由2缩进器签入的代码不断包装在他们的编辑器中。让每个开发人员都以相同的方式看到代码,会导致与行长度的一致性更高,而且还有其他问题。

    • 连续行缩进。有时,您希望缩进一行以指示它是从上一行携带的。如。

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

      如果使用制表符,那么在编辑器中使用不同制表符的人在不混合空格和制表符的情况下就无法将其对齐。这实际上扼杀了上述利益。

    显然,这是一个宗教性很深的问题,而编程却备受困扰。最重要的问题是我们应该选择一个——即使那不是你喜欢的那个。有时我认为重要的缩进最大的好处是,至少我们不需要设置支撑火焰战。

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

        7
  •  11
  •   Thane Brimhall    11 年前

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

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

    假设你使用2的标签宽度,我使用8的标签宽度。你写了所有的代码,你的最长行达到79个字符,然后我开始处理你的文件。现在我很难阅读代码,因为(正如政治公众人物所说的):

    大多数工具中的默认包装会破坏代码的视觉结构。

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

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

        8
  •  7
  •   quamrana Ryuzaki L    16 年前

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


    PEP-8注释

    PEP-8说 '每个缩进级别使用4个空格。'
    很明显,这是标准建议。

    “对于不想弄乱的旧代码,您可以继续使用8个空格的制表符。”
    很明显,在某些情况下可以使用选项卡。

    “不要混合制表符和空格。”
    这是明确禁止混合-我想我们都同意这一点。巨蟒可以检测到这一点,经常会窒息。使用-tt参数会使这成为一个显式错误。

    '最流行的python缩进方式是只使用空格。第二种最流行的方法是只使用制表符。”
    这清楚地表明两者都被使用。只是要非常清楚:您不应该在同一个文件中混合空格和制表符。

    '对于新项目,强烈建议只在选项卡上使用空格。'
    这是一个明确的建议,也是一个强有力的建议,但不是禁止标签。


    我在PEP-8中找不到一个很好的答案来回答我自己的问题。 我使用标签,这是我在其他语言中历史上使用过的。 python接受源代码,只使用制表符。这对我来说已经足够好了。

    我原以为我会去太空工作。在我的编辑器中,我配置了一个文件类型以独占使用空格,因此如果我按Tab键,它将插入4个空格。如果我按Tab太多次,我必须删除空格! 阿格! 删除次数是选项卡的四倍!我的编辑说不出我用了4个空格来缩进(尽管一个编辑可能会这样做),而且显然坚持一次删除一个空格。

    不能告诉python在读取缩进时将制表符视为n个空格吗? 如果我们可以就每个缩进4个空格和每个制表符4个空格达成一致,并允许Python接受这一点,那么就没有问题了。
    我们应该找到双赢的解决办法。

        9
  •  3
  •   Mark Cidade    16 年前

    JWZ says it best :

    当[人们]在读代码,当他们写完新代码后,他们关心当一个新的范围(或sexpr,或其他什么)打开时,代码倾向于缩进多少屏幕列…

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

    …这假设您从未在实际意义上使用制表符,例如字符串或字符常量,但我从未这样做:当它关系到它是制表符时,我总是使用'\t'。

        10
  •  3
  •   Skyler    13 年前

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

        11
  •  1
  •   Florian Bösch    16 年前

    由于python依赖缩进来识别程序结构,因此需要一种明确的识别方法。这就是选择空格或制表符的原因。

    但是,python也有一个很强的哲学,即只有一种方法可以做事情,因此应该有一个正式的推荐方法来做缩进。

    空格和制表符都对编辑器作为缩进处理提出了独特的挑战。在编辑器甚至用户设置中,选项卡本身的处理并不统一。因为空间是不可配置的,所以它们提供了更合理的选择,因为它们保证结果在任何地方都是一样的。

        12
  •  0
  •   sirwart    16 年前

    我能告诉你的最显著的优势是,很多程序员和项目使用一组列作为源代码,如果有人提交了一个改变,他们的tabstop设置为2个空格,而项目使用4个空格作为tabstop,那么长的行对于其他人的编辑器窗口来说太长了。我同意选项卡更容易使用,但我认为空间更容易协作,这对于像Python这样的大型开源项目很重要。

        13
  •  0
  •   Rod Daunoravicius    16 年前

    你可以吃你的蛋糕。设置编辑器以自动将选项卡展开为空格。

    (那将是 :set expandtab 在VIM中)

        14
  •  -1
  •   Gerald Senarclens de Grancy    12 年前

    除了已经命名的所有其他原因(一致性、从不混合空格和制表符等),我认为还有其他一些原因需要注意4个空格的约定。这些只适用于python(可能还有其他一些缩进有意义的语言)。根据个人喜好,其他语言的标签可能更好。

    1. 如果一个编辑器不显示制表符(这取决于配置,在相当多的情况下),另一位作者可能会假设您的代码使用4个空格,b/c几乎所有公开可用的python代码都使用4个空格;如果同一个编辑器的制表符宽度恰好为4,则可能会发生令人讨厌的事情-至少,这个可怜的人会在通过遵守惯例,很容易避免的压痕问题。所以对我来说,第一个原因是避免一致性的错误。

    2. 重新定义哪个更好,标签或空格,你应该问标签的优点是什么;我看到很多文章赞扬标签,但很少有令人信服的论点;像emacs,vi(m),kate,…根据代码的语义进行适当的缩进,即使没有制表符;同样的编辑器也可以很容易地配置为取消缩进退格符等。

    3. 在决定代码的外观/布局时,有些人在自由方面有很强的偏好;另一些人则看重一致性而非自由。python通过命令缩进用于块等,极大地减少了这种自由度。这可能被视为一个bug或特性,但它在选择python时也有一定的帮助。就我个人而言,我喜欢这种一致性——当开始在一个新项目上编写代码时,至少布局与我习惯的非常接近,所以很容易阅读。几乎总是如此。

    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"}
      

      然而,后者需要更多的代码行,而更少的行有时被认为是更好的(B/C在单个屏幕上得到更多)。但是,如果您喜欢对齐,空间(最好由一个好的编辑器辅助)在某种意义上给了您比标签更自由的python。[好吧,我想有些编辑器允许您使用tabs;)做相同的工作-但是使用空格,所有的编辑器都可以…]

    5. 回到其他人提出的相同论点——pep 8规定了(好的,强烈建议)空格。当然,如果是一个只使用制表符的项目,你就没有什么选择了。但由于PEP8约定的建立,几乎所有的Python程序员都习惯了这种风格。这使得在大多数程序员都能接受的风格上找到共识变得容易多了。另外,让个人在风格上达成一致可能很难。

    6. 有助于强制执行样式的工具通常不需要额外的努力就能了解PEP8。这不是一个很好的理由,但很高兴事情能开箱即用。

        15
  •  -3
  •   Benoit    16 年前

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

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

    对于空间,毫无疑问。一切都会按作者的意愿排列。

        16
  •  -4
  •   Community CDub    7 年前

    关于双方的讨论 Jim and Thomas Wouters 在评论中。

    问题是…由于制表符和空格的宽度都可以改变——而且由于程序员不能就两种宽度达成一致——为什么制表符要承担责任。

    我同意吉姆的观点——标签本身并不邪恶。但有一个问题…

    有了空间,我可以控制 “我自己的代码” 在世界上的每一位编辑看来。如果我使用4个空格——那么无论您在哪个编辑器中打开我的代码,它都将与左边距保持相同的距离。对于制表符,我可以随意使用编辑器的制表符宽度设置——甚至对于我自己的代码也是如此。我不喜欢这样。

    因此,尽管确实,即使是空格也不能保证一致性——它们至少能让您更好地控制自己的代码在任何地方的外观——而制表符不能做到这一点。

    我认为,不是程序员编写代码的一致性,而是显示代码的编辑器的一致性,空间更容易实现(和强制实施)。