请使用我遇到了IndentationError(或TabError)。我该如何修复它?来关闭那些由于混合使用制表符和空格而导致缩进错误的问题。这个问题特别讨论了这种缩进是如何解释的,而不是为什么会导致问题或如何修复它。
空格不能等同于制表符。使用制表符缩进的行与使用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
糟糕 - 尴尬了;我的反例证明表明制表符不等同于4个空格。正如Alex Martelli在评论中指出的那样,在Python 2中,制表符相当于8个空格,并且使用制表符和8个空格来调整示例可以证明这确实是情况。
x = 1
if x != 1:
^Iprint "x is not 1\n"
print "y is unset\n"
Python 3表示:首先,制表符将被替换为一个到八个空格,使得包括替换在内的总字符数是8的倍数(这意味着与Unix使用的相同规则)。然后,第一个非空白字符之前的空格确定了行的缩进。不能使用反斜杠在多个物理行上分割缩进;第一个反斜杠之前的空格决定了缩进。
遵循PEP 8的Python风格指南。PEP 8指出:
每个缩进级别使用4个空格。
对于你不想弄乱的旧代码,可以继续使用8个空格制表符。
制表符还是空格?
永远不要混合使用制表符和空格。
最常用的缩进Python方式只使用空格。第二种最流行的方式是仅使用制表符。使用制表符和空格的混合缩进的代码应该转换为仅使用空格。当使用-t选项调用Python命令行解释器时,它会发出有关非法混合制表符和空格的警告。当使用-tt时,这些警告变成错误。强烈建议使用这些选项!
即,算法的工作原理如下:如果源文件以混合制表符和空格的方式进行缩进,从而使含义取决于制表符的值,则拒绝缩进不一致;在这种情况下,将引发TabError。
如果制表符数量和空格数量与上一行匹配(无论顺序如何),则此行属于与上一行相同的块
如果其中一个(制表符或空格)的数量大于上一行的数量,并且另一个的数量至少等于上一行的数量,则这是一个缩进块。
元组 (tabs, spaces) 与先前块中的缩进匹配-将其减少到该块
否则会引发 IndentationError 或 TabError。
这就是为什么在 Python 中混合使用制表符和空格,甚至使用制表符进行缩进都被认为是非常不好的实践。
只是不要混淆它们 :)
将您的IDE /编辑器设置为在按下“tab”时输入4个空格,然后您就可以开始了。
在我的设置中,四个空格等于一个制表符,但据我所知,它们不能互换。您可以使用空格或制表符,但不能混用。
我认为在任何情况下,制表符都不应该出现在源代码中。它没有任何优势,而且会引起无尽的小错误。如果需要制表符,请使用带有 \t 的字符字符串,这样有自说明性的优点。
这里是关于制表符与空格的经典文章 - 我在自己的 .emacs 文件中使用了 jwz 的 elisp 变体。
(我承认个人违反了 PEP 8,只使用了 2 个字符的缩进 - 当你的行只有 80 个字符时,4 个字符就太多了...)