为什么在以下程序中引发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教程。
这是一个错误吗?如果是这样,导致它的原因是什么?
答案 0 :(得分:8)
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'
SyntaxError
代码路径检查exec()
和print()
边缘情况应该只针对实际的SyntaxError
实例,而不是子类,因为这只是令人困惑。
我已提交issue 31161来跟踪此事。