2010-06-10 110 views
7

Python的設計理念之一是「應該有一個......明顯的方法來做到這一點」。 (PEP 20),但這並非總是如此。我具體指的是(簡單)如果語句與布爾評估。考慮以下幾點:Python風格:if語句與布爾值評估

if words: 
    self.words = words 
else: 
    self.words = {} 

self.words = words or {} 

有了這樣一個簡單的情況下,這是最好,文體講?在更復雜的情況下,人們會選擇if語句來提高可讀性,對嗎?

+0

實用性打敗純度。 – 2010-06-10 06:59:32

+0

絕對或:) – 2012-03-14 11:15:57

回答

9

「There 應該只有一個」可以永遠是真的;這是肯定的說法「有只有一個」不能 - 「應該」意味着一個目標,一個目標,而不是總是達到它的可能性(例如,對於數字ab,禁止b + aa + b將是如此荒謬,以至於在這種情況下不能明顯地「只有一種方式」)。

在你的例子中,我會同意or在十分簡單的情況下是可取的(在一條清晰易讀的行中做四行是浪費垂直空間),但不適用於任何重要的謂詞複雜。決定什麼是「顯着的複雜性」當然是一個判斷呼叫。

0

(編輯)
以及像下面的情況下,我投的條件表達式

def somesuch(self, words=None): 
    self.words = words or {} 
    ... 
當然

,如果你認爲會改善可讀性(你可以大聲讀出來呀?) ,你可以試試

self.words = words if words else {} 
+0

你是對的!實際上,整個問題的靈感來自於試圖用類定義來做到這一點,並發現我的所有實例都共享相同的字典屬性。 – 2010-06-10 06:01:15

+1

-1:你可能不想這樣做(至少在一般情況下) - 可變的默認參數會讓你感到驚訝。例如,請參閱http://stackoverflow.com/questions/1132941/。 – 2010-06-10 06:45:23

+0

@斯科特格里菲斯:呃,對不起。我還沒有受到這個,但我猜想,因爲我沒有想到它。感謝您的網址。所以**在Python中沒有可變的默認參數**。保持-1,希望能幫助我記住這個教訓 – 2010-06-10 07:17:58

2

在這種情況下,我會說「顯式優於隱式」。

當有人讀你的代碼時,他們可以做出一些假設。 他們可以認爲「單詞」可以是一個空的詞典,也可以是一個包含數據的詞(在沒有時爲空) 在這種情況下,他們可能會試圖優化您的代碼。 他們甚至可能是正確的,如果沒有說明你可以得到一個None值。

如果「單詞」其實可以沒有,我會盡量清楚,與:

self.words = words 
if words is None: 
    self.words = {} 

或可能是「其他」,而不是無條件轉讓第一。 在任何情況下,您都可以通過這種方式來記錄「無」是「單詞」的期望值這一事實。