为什么混合制表符和空格有误,但其他PEP8违规却没有?

时间:2016-05-22 05:42:58

标签: python-3.x tabs indentation pep8

我一直在阅读PEP 8,但我不明白为什么Python3很难用这个错误信息来挑出标签和空格。

  

TabError:缩进中标签和空格的使用不一致

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

那么交易是什么,为什么Python3突然间会把混合空间和标签视为最终的邪恶?

1 个答案:

答案 0 :(得分:2)

你可以很好地混合python文件中的标签和空格(虽然PEP8说你不应该这样做。)

(Stackoverflow将标签打印为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

最后一行可能看起来像是与字符串对齐,因此会立即返回,但由于它的标签缩进,或许它与while排列(因此while循环永不退出)。 ???

这里存在歧义,因此解析器说不。

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