为什么混合制表符和空格会出错,而其他 PEP8 违规却不会?

Why is there an error for mixing tabs and spaces but not other PEP8 violations?

我一直在阅读 PEP 8,但我不明白为什么 Python3 费心将标签和 space 与此错误消息混在一起。

TabError: inconsistent use of tabs and spaces in indentation

我理解一致性的重要性,但停止执行的错误消息似乎很极端,尤其是因为混合制表符和 spaces 对编译器没有任何影响,而且大多数优秀的编辑器都支持 tab/space 转换。最重要的是,Python3 对您忽略其他 PEP 约定没有问题(例如使用三个 space 缩进而不是四个),您甚至不会收到警告消息。

那是怎么回事,为什么 Python3 突然间把混合 space 和标签视为终极邪恶?

您可以在 python 文件中很好地混合制表符和空格(尽管 PEP8 说您不应该这样做)。

(Whosebug 将制表符打印为 4 个空格,示例制表符在 this gist 中是正确的;请自行测试!)

这是一个完全有效的 python 函数:

def foo():
    print("one tab")  # all indentation is one tab.
    if True:
      print("two spaces")
    else:
        print("four spaces")

你不能做的是在同一个块中混用制表符和空格:

def foo():
    print("one tab")
        print("eight spaces")

这给出了 TabError.

即使这些在您的文本编辑器中排列。


这是因为(大致)它们可能在其他人的文本编辑器中排列不同,看起来像不同的程序。举一个愚蠢的例子:

def foo():
    while True:
        "we should exit immediately"
        return True  # suppose this was tab indented

最后一行可能看起来与字符串对齐,因此立即 returns,但由于它是制表符缩进,它可能与 while 对齐(因此 while 循环永远不会退出)。 ???

这里存在歧义,所以解析器说不。


但是,PEP8 说你应该总是使用 4 个空格,避免这种歧义。