在「 if」語句中設置多行條件的樣式?

有時我將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


#1樓

就我的而言,我喜歡在長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


#2樓

這並無太大改善,可是...

allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and
                 cond3 == 'val3' and cond4 == 'val4')

if allCondsAreOK:
   do_something

#3樓

您不須要在第二條條件行上使用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年起)建議使用括號。


#4樓

我建議將and關鍵字移到第二行,並將包含條件的全部行縮進,而不是兩個空格:

if (cond1 == 'val1' and cond2 == 'val2'
  and cond3 == 'val3' and cond4 == 'val4'):
    do_something

這正是我在代碼中解決此問題的方式。 將關鍵字做爲該行的第一個單詞可使條件更具可讀性,而且減小空格的數量進一步將條件與操做區分開。


#5樓

當我有一個很是大的if條件時,我更喜歡這種風格:

if (
    expr1
    and (expr2 or expr3)
    and hasattr(thingy1, '__eq__')
    or status=="HappyTimes"
):
    do_stuff()
else:
    do_other_stuff()
相關文章
相關標籤/搜索