Python 3允许混合空格和制表符?

时间:2016-03-17 14:36:21

标签: python python-3.x indentation

我知道标签与空格有很多问题,但看起来,与{3}}关于Python 3的说法相反,混合标签和空格并不总是非法的。具体来说,在同一个块中混合制表符和空格是非法的,但在同一个文件中允许带有空格的块和带有制表符的块。

例如,这会在Python 3.4上抛出一个TabError:

for x in range(10):
    print(x)  # Spaces
    print(x)  # Tab

但这很好:

for x in range(10):
    print(x)  # Spaces

for y in range(5):
    print(y)  # Tab

这是设计吗?

编辑:问题是标签是否优于空格。问题是Python是否允许在同一文件中使用制表符和空格。

2 个答案:

答案 0 :(得分:5)

对此的测试非常简单(Lib/tests/test_exceptions.py):

    self.raise_catch(TabError, "TabError")
    try: compile("try:\n\t1/0\n    \t1/0\nfinally:\n pass\n",
                 '<string>', 'exec')
    except TabError: pass
    else: self.fail("TabError not raised")

查看实际抛出此错误的代码(Parser/tokenizer.ctok_get()),看起来这只是将缩进类型与之前的行使用的内容进行比较,并且而不是整个文件中使用的内容。

文档说(Doc/reference/lexical_analysis.rst,强调我的)

  

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

如果&#34;阻止&#34;混合制表符和空格是可以的。完全&#34;分开&#34;通过回到缩进级别0;因为标签宽度设置不会混淆程序的逻辑。在Python中混合制表符和空格的问题是Python 假设一个制表符是八个空格宽,但程序员的编辑器可能会使用其他东西。例如,代码如下:

def my_fun(i):
    if i == 6:
        foo()
------->bar()  # Tab

将被视为具有4的tabstop:

def my_fun(i):
    if i == 6:
        foo()
    bar()

这显然不是该计划的作用!

但在以下情况下:

def my_fun(i):
    if i == 6:
        foo()
        bar()

def my_fun2(i):
--->if i == 7:
--->--->foo()
--->--->bar()

从一个&#34;逻辑&#34;它可以。观点,无论我如何查看标签,它总是清楚逻辑是什么。当然仍然在单个文件中混合制表符和空格是一个坏主意,但这只是一个风格错误,而不是逻辑错误; - )

所以回答这个问题:从文档中的那一行来看,我 会说这是设计的。但是,我无法为此找到PEP 案件未经过测试。我不会依赖于所有 Python版本 未来表现一样!

答案 1 :(得分:1)

Python试图对每个代码块进行细分,这样当你复制和粘贴时,它仍然可以工作,而且你不会被迫使一切都完美无缺。 python的众多美女之一。

PEP 8只是最易读的代码的惯例,我建议你遵循它,但你不必须

如果你想查找PEP 8所包含的内容,有几个编辑器会检查你的代码是否存在python中合法的违规行为,但不是很好。我用PyCharm。当你在同一个文件中使用空格和制表符时,PyCharm不喜欢它,并且它会因为波浪形的衬里而变得松散。