2017-08-09 67 views
7

为什么在下面的程序中提出了IndentationError而不是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。在后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.

这是一个错误?如果是这样,那是什么造成的?

回答

8

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' 

exec()print()边缘案件的SyntaxError代码路径检查确实应该只火了实际SyntaxError实例,而不是子类,因为这只是混乱。

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

+0

所以你说这是意图行为? –

+0

@ChristianDean:不完全,我会看看这是否作为bug提交。 –

+0

_“你在这里有两个错误。”_ - 但是如果我在这里必须有两个错误,那么Python通常不会说“在处理上述异常的过程中发生了另一个异常”? –

相关问题