[Python] 被 if-else 敘述和 tuple 運算子的優先權騙啦!
今天遇到 Python 一個烏龍事件…
在做程式碼審查 (code review) 時,看到了像下面的程式:
info = "data" info if True else None, 123
很直覺地認為這裡有「問題」…
看起來像是某些情況下會回傳 info 這個字串,
某些情況下會回傳 (None, 123) 這個 tuple,
雖然 Python 允許函式傳回不同型式的值,
但這樣是很容易出錯的!(←自以為)
將意見回報給寫了這行程式的同事後,
過了幾天發現「問題」還沒修掉,
於是在另一個 code review 會議提出來,
其他的同事也覺得這樣寫會有「問題」…
結果後來終於搞懂了~
因為 優先權 的關係,所以那一行的意思其實比較像是:
(info if True else None), 123
用 Python 直譯器跑跑看吧~
確實是不管 if-else 的結果為何,最終都是傳回了一個 tuple:
>>> info = "data" >>> info if True else None, 123 ('data', 123) >>> info if False else None, 123 (None, 123)
詳細的優先權比較,可以參考 Operator precedence 文件的說明囉~
不過,像這種容易引發誤會的程式,
用括號 () 括起來,就比較不會有爭議囉~
(本頁面已被瀏覽過 340 次)