[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 Manualの5.10 Boolean operationsには、
expression ::= or_test [if or_test else test] | lambda_form
と書かれていますが、このelseの後ろのtestは、expressionの間違いではないかと思われます。