[Python] 三項式の優先順位

環境

この記事の内容は、Python 2.5で確認しました。

三項式の優先順位

1 + 10 if False else 20 + 100 if False else 200

は、

(1 + 10) if False else ((20 + 100) if False else 200)

のように評価されます(この式の結果は、200になります)。

詳細

Pythonの文法は、ソースコードのGrammer/Grammerというファイルに記述されています。そこには、以下の記述があります。

test: or_test ['if' or_test 'else' test] | lambdef

or_testは、様々な演算(+や-など)や比較、リテラルになります。このため、ifの前の式は、ひとまとまりになります。

testは、'else'のあとで再帰しているので、'else'の後ろに再び三項式があった場合、それは'else'句に含まれることになります。

よって、

1 + 10 if False else 20 + 100 if False else 200

は、

(1 + 10) if False else ((20 + 100) if False else 200)

のように評価されます。

私は、

1 + 10 if False else 20 + 100 if False else 200

の結果は221になるのではないかと予想していたのですが、そうするためには、

1 + (10 if False else 20) + (100 if False else 200)

と書く必要があります。

Pythonのドキュメントとの相違

Python Reference Manual5.10 Boolean operationsには、

expression  	::=  	or_test [if or_test else  test] | lambda_form

と書かれていますが、このelseの後ろのtestは、expressionの間違いではないかと思われます。