2017-08-09 25 views
7

SyntaxErrorではなく、次のプログラムでIndentationErrorが呼び出されるのはなぜですか?なぜ、SyntaxErrorではなく、ここでIndentationErrorが発生していますか?

>>> 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ではありません。

“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.

が、これはバグです:ポストWhat does “SyntaxError: Missing parentheses in call to 'print'” mean in Python?のトップの答えも、これをサポートするように見えますか?もしそうなら、それは何の原因ですか?

答えて

8

IndentationErrorは、SyntaxErrorのサブクラスなので、技術的には、このです。構文エラーが発生します。

ここに2つののエラーがあります。インデントが両方とも間違っていますあなたはカッコがありません。 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:これはまだバグとして提出されているかどうかはわかりません。 –

+0

_ここに2つのエラーがあります。_ _しかし、ここで2つのエラーが発生した場合、Pythonは通常、「上記の例外の処理中に別の例外が発生しました」というようなことを言っていませんか? –

関連する問題