为什么在这里引发 IndentationError 而不是 SyntaxError?

Why is an IndentationError being raised here rather than a SyntaxError?

为什么在下面的程序中引发的是 IndentationError 而不是 SyntaxError

>>> if True:
... print "just right!"
  File "<stdin>", line 2
    print "just right!"
        ^
IndentationError: Missing parentheses in call to 'print'

为了确保 IDLE 不仅仅是搞笑,我还通过 运行 从普通源文件中测试了这段代码。仍在引发相同的异常类型。我用来测试的 Python 版本是 Python 3.5.2 和 Python 3.6.1。

据我了解,使用 print 时缺少括号会被视为 SyntaxError,而不是 IndentationError。 post What does “SyntaxError: Missing parentheses in call to 'print'” mean in Python? 中的最高答案似乎也支持这一点:

“SyntaxError: Missing parentheses in call to 'print'” is a new error message that was added in Python 3.4.2 primarily to help users that are trying to follow a Python 2 tutorial while running Python 3.

这是一个错误吗?如果是,是什么原因造成的?

IndentationErrorSyntaxError 的子类,因此从技术上讲,这 引发的语法错误。

这里有 两个 错误。缩进都是错误的 你缺少括号。这是一个小错误,当检测到 print 特殊情况时,有代码会更改 SyntaxError 消息,并且该代码仍然适用于 SyntaxError 的子类(它应用于SyntaxError 异常构造函数)。

您可以为 TabError 异常触发相同的错误:

>>> compile('if 1:\n    1\n\tprint "Look ma, tabs!"', '', 'single')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "", line 3
    print "Look ma, tabs!"
                         ^
TabError: Missing parentheses in call to 'print'

SyntaxError 代码路径检查 exec()print() 边缘情况实际上应该只针对实际的 SyntaxError 实例触发,而不是子类,因为这只是令人困惑。

我已经提交 issue 31161 来跟踪这个。