【问题标题】:Why is an IndentationError being raised here rather than a SyntaxError?为什么这里会引发 IndentationError 而不是 SyntaxError?
【发布时间】:2018-01-17 09:56:51
【问题描述】:

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

“SyntaxError: Missing parentheses in call to 'print'” 是 Python 3.4.2 中添加的新错误消息,主要是为了帮助尝试 在运行 Python 3 时遵循 Python 2 教程。

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

【问题讨论】:

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


    【解决方案1】:

    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 以跟踪此问题。

    【讨论】:

    • 所以你是说这是有意的行为?
    • @ChristianDean:不完全是,我会看看这是否已作为错误提交。
    • “你这里有两个错误。” - 但是如果我在这里有两个错误,Python通常不会说类似“在处理上述异常期间,另一个发生异常”?
    • @ChristianDean:这是一个例外,但有两个语法错误。 SyntaxError 构造函数旨在检测特殊情况,但在这里会出错。
    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 2014-01-04
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多