Python 3中的TabError

时间:2013-08-14 07:32:58

标签: python python-3.x

给出以下解释器会话:

>>> def func(depth,width):
...   if (depth!=0):
...     for i in range(width):
...       print(depth,i)
...       func(depth-1,width)
  File "<stdin>", line 5
    func(depth-1,width)
                  ^
TabError: inconsistent use of tabs and spaces in indentation

有人可以告诉我代码中的TabError是什么吗?

1 个答案:

答案 0 :(得分:10)

TL; DR:永远不要用 TAB 缩进Python代码


在Python 2中,the interpretation of TAB is as if it is converted to spaces using 8-space tab stops;也就是说每个 TAB 将缩进进一步加1到8个空格,这样得到的缩进就可以被8整除。

然而,这不再适用于Python 3 - 在Python 3 mixing of spaces and tabs is - if not always a SyntaxError - not a good thing to do - 简化[*]中,制表符只匹配制表符,空格只与缩进中的其他空格匹配;这是一个用 TAB缩进的块 SPACE SPACE 可能包含一个用 TAB SPACE缩进的块 SPACE TAB ,但如果它包含 TAB TAB ,则会被视为缩进错误,甚至虽然该区块似乎会进一步延伸。

这就是为什么混合制表符和空格,或者根本使用制表符进行缩进的原因在Python中被认为是非常糟糕的做法。


[*]好吧,我确实躺在那里 - 事情并非那么简单。 Python 3实际上允许使用缩进的块内嵌 TAB TAB TAB TAB TAB SPACE SPACE 。来自Python documentation

  

2.1.8。压痕

     

逻辑行开头的前导空格(空格和制表符)用于计算行的缩进级别,而后者又用于确定语句的分组。

     

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

     

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

由于 TAB TAB TAB TAB 缩进深于 TAB SPACE SPACE 即使标签是一个空格宽,实际上也允许缩进。然而,这是如此神秘,你可能想要忘记它,只是相信我上面所说的......或者甚至认为Python根本不允许使用 TAB 进行缩进。