2017-08-09 75 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通常不會說「在處理上述異常的過程中發生了另一個異常」? –

相關問題