为什么混合制表符和空格会出错,而其他 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 个空格,避免这种歧义。
我一直在阅读 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 个空格,避免这种歧义。