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

时间:2017-08-09 13:19:29

标签: python python-3.x syntax-error indentation

为什么在以下程序中引发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。帖子What does “SyntaxError: Missing parentheses in call to 'print'” mean in Python?中的最佳答案似乎也支持这一点:

  

“SyntaxError:调用&#39; print&#39;”时缺少括号是Python 3.4.2中添加的新错误消息,主要是为了帮助尝试的用户   在运行Python 3时遵循Python 2教程。

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

1 个答案:

答案 0 :(得分:8)

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

此处有两个错误。缩进都是错误的你缺少括号。这是一个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'

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

我已提交issue 31161来跟踪此事。