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

Chr*_*ean 6 python indentation syntax-error python-3.x

为什么在以下程序中IndentationError被提升而不是SyntaxError?

>>> if True:
... print "just right!"
  File "<stdin>", line 2
    print "just right!"
        ^
IndentationError: Missing parentheses in call to 'print'
Run Code Online (Sandbox Code Playgroud)

为了确保IDLE不只是表现得很有趣,我还通过从普通源文件运行它来测试此代码.仍然会引发相同的异常类型.我用来测试它的Python版本是Python 3.5.2和Python 3.6.1.

我的理解是,在使用时缺少括号print被认为是a SyntaxError,而不是a IndentationError.帖子中的首要答案在Python中,"SyntaxError:调用'print'时缺少括号"是什么意思?似乎也支持这个:

"SyntaxError:调用'print'时缺少括号"是Python 3.4.2中添加的新错误消息,主要是为了帮助那些在运行Python 3时尝试遵循Python 2教程的用户.

这是一个错误吗?如果是这样,是什么导致了它?

Mar*_*ers 7

IndentationError是SyntaxError技术上的子类,这是一个语法错误.

你有两个错误.缩进都是错误的,你缺少括号.这是一个bug,有一些代码SyntaxError在print检测到特殊情况时改变了消息,并且该代码仍然适用于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'
Run Code Online (Sandbox Code Playgroud)

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

我已经提交了问题31161来跟踪这个问题.