2017-01-10 97 views
2

是否有實現這個邏輯更Python的方式:檢查無,假,真

res = func() 

if res is not None:   # res is either True, False, something else 
    if res is True:     
     #do something  # res is True 
    elif res is False:     
     #do something else # res is False 
    else: 
     #do something else2 # res is not in [True,False] 
else:      
    #failed     # res is None 

回答

6

不,你已經擁有了它覆蓋。

一般來說,不要使用is Trueis False,如果你必須有三態布爾值,使用:

if res is None: 
    # handle None case 
elif res: 
    # handle true case 
else: 
    # handle false case 

例如把開發負擔放在正確使用三態的地方。

如果函數需要傳遞更多的狀態,則不應該使用布爾值;在這種情況下切換到使用enum value

1

您可以創建一個函數將值映射到相應的函數。喜歡的東西:

# Function to map values 
def do_something(res): 
    return { 
     None: func_1, # Each `res` mapped to corresponding function 
     True: func_2, 
     False: func_3, 
    }.get(res, func_4) 


do_something(res)() 
#    ^call the function returned by `do_something()` 

上述代碼的等效可以基於有關提到你的邏輯這樣寫:

if res is not None: 
    if res is True:     
     func_2()  
    elif res is False:     
     func_3() 
    else: 
     func_4() 
else:      
    func_1() 
+1

對於三態,我會說使用一張地圖是矯枉過正的。將所有內容都轉換爲函數的方式當然不會更具可讀性。如果'res'既不是'None'或布爾對象(在這種情況下你會得到一個異常),你也不會解決應該發生什麼。這可能是可取的,但請明確討論。 –

+0

處理'do_something'函數返回的None情況。由於OP已經編輯了向其他條件的第一個if語句添加附加條件,所以我們可以在'get()'' –

+0

'處使用* default *函數更好,但我不會稱之爲Pythonic。 –

0
if res is None: 
    #do something 
elif res: 
    #do something else 
elif not res: 
    #do something else 2