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

Python 3 allows mixing spaces and tabs?

我知道有很多关于制表符和空格的问题,但似乎与 PEP 0008 关于 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 在同一文件中允许制表符和空格是否是设计使然。

Python 尝试将每个小代码块分段,这样当您复制和粘贴时,它仍然有效,并且您不会被迫让一切都变得完美。 python.

众多美女之一

PEP 8 只是最易读代码的约定,我建议您遵循它,但您不必必须

如果您想了解 PEP 8 包含的内容,有几个编辑器会检查您的代码是否存在 python 中合法但不友好的违规行为。我使用 PyCharm。 PyCharm 不喜欢在同一个文件中使用空格和制表符,它会因为下划线的波浪形而变得尖刻。

对此的测试非常简单 (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()),看起来这只是将缩进类型与 previous 行,而不是整个文件中使用的内容。

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

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

如果 "blocks" 完全 "separated" 返回到缩进级别 0,则可以混用制表符和空格;因为制表符宽度设置不会混淆程序的逻辑。在 Python 中混用制表符和空格的问题是 Python 假定 制表符是八个空格宽,但程序员的编辑器可能会使用其他东西。例如,这样的代码:

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

将被视为带有 4 个制表位的:

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()

从 "logic" 的角度来看没问题,因为无论我如何查看选项卡,逻辑总是很清楚。在一个文件中混用制表符和空格当然仍然是个坏主意,但这只是风格错误,而不是逻辑错误;-)

所以回答这个问题:从文档中的那一行来看,我 会说这是设计使然。不过,我找不到这个的 PEP,还有这个 案例未经测试。我不会依赖 all Python 中的版本 未来也一样!