[Python] 被 if-else 敘述和 tuple 運算子的優先權騙啦!

[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 文件的說明囉~

不過,像這種容易引發誤會的程式,

用括號 () 括起來,就比較不會有爭議囉~

(本頁面已被瀏覽過 36 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料