有時我將if
的長條條件分紅幾行。 最明顯的方法是: app
if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
在視覺上不是很吸引人,由於動做與條件融爲一體。 可是,這是使用正確的4個空格的Python縮進的天然方法。 spa
目前,我正在使用: code
if ( cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
但這不是很漂亮。 :-) ci
您能推薦一種替代方法嗎? get
就我的而言,我喜歡在長if語句中添加含義。 我將不得不搜索代碼以找到合適的示例,但這是我想到的第一個示例:假設我碰巧遇到了一些古怪的邏輯,我想根據許多變量來顯示特定頁面。 io
英語:「若是登陸的用戶不是管理員教師,而是普通教師,而不是學生自己...」 登錄
if not user.isAdmin() and user.isTeacher() and not user.isStudent(): doSomething()
固然,這看起來不錯,可是若是須要大量閱讀,請閱讀這些內容。 咱們如何將邏輯分配給有意義的標籤。 「標籤」其實是變量名: 變量
displayTeacherPanel = not user.isAdmin() and user.isTeacher() and not user.isStudent() if displayTeacherPanel: showTeacherPanel()
這可能看起來很愚蠢,可是您可能還有另外一種狀況,您僅在如下狀況下才要顯示其餘項目:(僅當您正在顯示教師面板時)或者默認狀況下用戶能夠訪問該其餘特定面板: 搜索
if displayTeacherPanel or user.canSeeSpecialPanel(): showSpecialPanel()
嘗試在不使用變量來存儲和標記邏輯的狀況下編寫上述條件,不只會獲得很是混亂且難以理解的邏輯語句,並且還會重複本身。 儘管有合理的例外狀況,但請記住:不要重複本身(DRY)。 bug
這並無太大改善,可是...
allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4') if allCondsAreOK: do_something
您不須要在第二條條件行上使用4個空格。 可能使用:
if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
另外,不要忘記空白比您想象的更靈活:
if ( cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4' ): do_something if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
二者都至關醜陋。
也許丟了括號(儘管《 風格指南》不鼓勵這樣作)?
if cond1 == 'val1' and cond2 == 'val2' and \ cond3 == 'val3' and cond4 == 'val4': do_something
這至少使您不同凡響。
甚至:
if cond1 == 'val1' and cond2 == 'val2' and \ cond3 == 'val3' and \ cond4 == 'val4': do_something
我想我更喜歡:
if cond1 == 'val1' and \ cond2 == 'val2' and \ cond3 == 'val3' and \ cond4 == 'val4': do_something
這是《 樣式指南》 ,(自2010年起)建議使用括號。
我建議將and
關鍵字移到第二行,並將包含條件的全部行縮進,而不是兩個空格:
if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
這正是我在代碼中解決此問題的方式。 將關鍵字做爲該行的第一個單詞可使條件更具可讀性,而且減小空格的數量進一步將條件與操做區分開。
當我有一個很是大的if條件時,我更喜歡這種風格:
if ( expr1 and (expr2 or expr3) and hasattr(thingy1, '__eq__') or status=="HappyTimes" ): do_stuff() else: do_other_stuff()