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

标签 python python-3.x indentation

我知道有很多关于制表符和空格的问题,但似乎与PEP 0008相反说到 Python 3,混合制表符和空格并不总是非法的。具体来说,在同一 block 中混用制表符和空格是非法的,但在同一文件中允许包含空格的 block 和包含制表符的 block 。

例如,这会在 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 在同一文件中允许使用制表符和空格是否是设计使然。

最佳答案

对此的测试非常简单(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,强调我的)

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.

如果“ block ”通过返回到缩进级别 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()

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

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

关于Python 3 允许混合使用空格和制表符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36063679/

相关文章:

python - 如何检查另一个程序中的任务是否已完成?

python - 如何解码 python 中的反斜杠转义字符串?

python - 使用 Python 在 Visual Studio Code 中意外缩进

python - 如何向量化多维矩阵的 Softmax 概率

python - 无需修改第三方代码即可抑制警告

python - 不能使用麻线在pypi上上传二进位轮

python - 这种奇怪的冒号行为在做什么?

python - 通过python获取矢量角度

java - 正确缩进 Java/Kotlin 控制台输出

c# - 如何使用 XDocument.Save 使用属性的自定义缩进保存文件