2010-07-27 60 views
3

類型的字典方式有一個非常好的方法get最乾淨的Python在Python兩個值之間選擇

# m is some dict 
m.get(k,v) # if m[k] exists, returns that, otherwise returns v 

是否有某種方式爲任意值做到這一點?例如,在Perl我可以這樣做:

return $some_var or "some_var doesn't exist." 
+0

我的錯誤,這是不工作的我的類一些原因。投票結束後,這在回顧過程中顯得很明顯。 – 2010-07-27 22:48:31

+0

作爲答案的提示,你可以在Python中使用像這樣的運算符。但我很好奇:人們通常會認爲這個成語Pythonic?我沒有親眼見過它在Python代碼中,但我在各地的Perl代碼中看到它。 – 2010-07-27 22:48:39

+5

'return'聲明不會做你認爲它做的事。請參閱http://stackoverflow.com/questions/1512547/what-is-the-difference-between-perls-or-and-and-short-circuit-op – mob 2010-07-27 22:48:45

回答

2

or運營商在Python是guaranteed返回其操作數中的一個,如果左邊表達式的計算結果爲False,正確的評估和返回。

編輯:重新閱讀您的問題

後,我發現我誤會了它的第一次。通過使用locals()內置的功能,您可以使用變量get()方法,就像你使用它的類型的字典(雖然它既不非常漂亮,也沒有Python的),檢查一個值是否存在:

>>> locals().get('some_var', "some_var doesn't exist.") 
"some_var doesn't exist." 
>>> some_var = 0 
>>> locals().get('some_var', "some_var doesn't exist.") 
0 
1

短路也可以在Python中工作。

return a or b 
2

如果你需要能夠處理「假十歲上下的」值更具體的(例如,0''是良好的價值觀,但NoneFalse都沒有),還有的更詳細的「條件表達式」(又名三元操作者)在Python 2.5介紹:

return x if <cond> else y 

其中<cond>可以是任何條件:

return x if isinstance(x, basestring) else y 
1

實際上Python ehre有所不同: 如果沒有定義名爲some_var的變量,則無法訪問它以知道它不存在 - 您將收到NameError異常。

這樣設計是這樣的:未定義的變量名沒有「undefined」或「null」值,它們引發一個異常,這是從Python到大多數動態類型語言的巨大差異之一。

所以,Pythonic並不是一個聲明,可以定義或不定義some_var。在一個好的程序中,它將被定義,即使包含「無」或「假」 - 在這種情況下,「或」成語將起作用,但推薦的方式是使用表達式if

return some_var if some_var else "some_var contains a False Value" 

如果你碰巧有機會上那裏some_var可能不被定義的代碼,而不能用於soemr陳奕迅改變這種狀況,你可以檢查字符串「some_var」的存在爲localv ariables的dicitonary的關鍵,通過locals()返回知道它是否被定義:

return some_var if "some_var" in locals() else "some_var was not defined" 

那不是最Python的方式要麼 - 必須處理變量,我沒有定義是Python例外的例外。所以最好的初步實踐。將嘗試使用try事業裏面的瓦爾內容,趕上「NameError」異常,如果該變種不存在:

try: 
    return some_var 
except NameError: 
    return "some_var not defined"