Python对缩进的制表符和空格的解释

时间:2010-01-09 18:57:26

标签: python tabs indentation spaces

我决定,我学习了一点Python。第一个介绍说它使用缩进来分组语句。虽然最好的习惯显然只使用其中一种,如果我互换它会发生什么?多少个空格将被视为等于一个标签?或者如果标签和空格混合在一起会不会起作用?

7 个答案:

答案 0 :(得分:35)

空格不被视为与制表符等效。使用制表符缩进的行与缩进为1,2,4 或8 空格的行的缩进位置不同。

通过反例证明(错误,或者,最好是有限的 - 标签!= 4个空格):

x = 1
if x == 1:
^Iprint "fff\n"
    print "yyy\n"

^I”显示 TAB 。当通过Python 2.5运行时,我收到错误:

  File "xx.py", line 4
    print "yyy\n"
                ^
IndentationError: unindent does not match any outer indentation level

因此显示在Python 2.5中,制表符不等于空格(特别是不等于4个空格)。


哎呀 - 尴尬;我通过反例的证明表明,标签不等于4个空格。正如Alex Martellicomment中指出的那样,在Python 2中,制表符相当于8个空格,并且使用制表符和8个空格调整示例表明情况确实如此。

x = 1
if x != 1:
^Iprint "x is not 1\n"
        print "y is unset\n"

在Python 2中,此代码有效,无需打印。


在Python 3中,规则略有不同(notedAntti Haapala。比较:

Python 2说:

  

首先,标签被替换(从左到右)一到八个空格,使得直到并包括替换的字符总数是八的倍数(这与Unix使用的规则相同) )。然后,第一个非空白字符前面的空格总数确定行的缩进。缩进不能使用反斜杠在多个物理行上分割;直到第一个反斜杠的空格决定了缩进。

Python 3说:

  

标签被替换(从左到右)一到八个空格,使得直到并包括替换的字符总数是八的倍数(这与Unix使用的规则相同)。然后,第一个非空白字符前面的空格总数确定行的缩进。缩进不能使用反斜杠在多个物理行上分割;直到第一个反斜杠的空格决定了缩进。

(除了开头的单词“First”,这些都是相同的。)

Python 3增加了一个段落:

  

如果源文件混合制表符和空格的方式使得含义依赖于空格中制表符的价值,则缩进被拒绝为不一致;在这种情况下会引发TabError。

这意味着在Python 2中工作的 TAB vs 8-space示例将在Python 3中生成TabError。最好 - 在Python 3中必需 - 确保字符序列的制作块中每行的缩进是相同的。 PEP8说'每个缩进级别使用4个空格'。 (谷歌的编码标准说“使用2个空格”。)

答案 1 :(得分:18)

关注Python样式的PEP 8。 PEP 8说:   压痕

  

每个缩进级别使用4个空格。

     

对于你不想搞砸的真正旧代码,你可以继续   使用8个空格的标签。

标签或空格?

  

切勿混合标签和空格。

     

缩进Python最流行的方法是仅使用空格。该   第二种最流行的方式是仅使用标签。代码缩进了一个   标签和空格的混合应该转换为使用空格   只。使用Python调用Python命令行解释器时   -t选项,它会发出有关非法混合标签的代码的警告   和空间。使用-tt时,这些警告会出错。这些   强烈推荐选项!

答案 2 :(得分:8)

在Python 2中,对 TAB 的解释就好像是使用8空格制表符将其转换为空格(由之前的答案提供);也就是说每个 TAB 将缩进进一步加1到8个空格,这样得到的缩进就可以被8整除。

但是这不再适用于Python 3 - 在Python 3 mixing of spaces and tabs are always an error中 - 标签只匹配制表符,空格只与缩进中的其他空格匹配;这是一条用 TAB SPACE SPACE 缩进的行,也可以包含用 SPACE SPACE缩进的行 TAB ;并且可能包含一个缩进的块,用 TAB SPACE SPACE TAB 缩进,但如果它包含 TAB TAB ,它将被视为一个 缩进错误,即使该块似乎会进一步扩展:

  

如果源文件混合制表符和空格的方式使得含义依赖于空格中制表符的价值,则缩进被拒绝为不一致;在这种情况下会引发TabError。

即。算法的工作原理如下:

  • 如果选项卡的数量空格数与前一行匹配(无论顺序),则此行属于与上一行相同的块

    < / LI>
  • 如果(制表符,空格)之一的数字大于上一行的数字,而另一个的数字至少等于前一行的数字,则为缩进块

    < / LI>
  • 元组(tabs, spaces)匹配前一个区块的缩进 - 这个区块是

  • 否则会引发IndentationErrorTabError

这就是混合制表符和空格,甚至使用制表符进行缩进的原因,在Python中被认为是一种非常糟糕的做法。

答案 3 :(得分:5)

只是不要互换它们:) 将你的IDE /编辑器设置为在按下“tab”时输入4个空格,你就可以了。

答案 4 :(得分:5)

我建议您浏览PEP 8这是Python代码的“官方”Python样式指南。它包括(除其他外)使用标签/空格。

答案 5 :(得分:2)

四个空格是一个标签(在我的设置中),但据我所知,它们不会互换。您可以使用空格或制表符,而不是两者。

答案 6 :(得分:0)

我认为制表符在任何情况下都不应该出现在源代码中。它没有任何优势,它是微小错误的无穷无尽的来源。 - 如果需要选项卡,请使用带\ t的字符串,它具有自我记录功能。

Here是关于标签与空格的经典文章 - 我在自己的.emacs文件中使用了jwz的elisp变体。

(我承认通过仅使用2个字符的缩进来亲自打破PEP 8 - 当你的行只有80个字符时,4个字符很多......)