我有一個函數按照首選項的順序返回了幾個組的隨機成員。它繼續是這樣的:除了「pass:pass」,還有一個更好的選擇嗎?
def get_random_foo_or_bar():
"I'd rather have a foo than a bar."
if there_are_foos():
return get_random_foo()
if there_are_bars():
return get_random_bar()
raise IndexError, "No foos, no bars"
然而,第一件事get_random_foo
確實是驗證有FOOS併發出IndexError
如果不是,那麼there_are_foos
是多餘的。此外,涉及數據庫並使用單獨的函數會產生併發問題。因此,我重寫它是這樣的:
def get_random_foo_or_bar():
"Still prefer foos."
try:
return get_random_foo()
except IndexError:
pass
try:
return get_random_bar()
except IndexError:
pass
raise IndexError, "No foos, no bars"
但我覺得這更易讀,因爲我從來沒有理由使用pass
以前感覺instictively錯誤。
有沒有更好的高效模式,還是應該學會接受pass
?
注:我想避免任何嵌套,因爲其他類型可能稍後添加。
編輯
感謝大家誰說,pass
是罰款 - 這是令人欣慰!
也感謝那些建議用返回值None
替換異常的人。我可以看到這是一種有用的模式,但我認爲在這種情況下它的語義錯誤:函數被要求執行一個不可能完成的任務,因此他們應該引發一個異常。我更願意遵循random
模塊的行爲(例如,random.choice([])
)。
在'except'語句的使用可能是在Python中最常見的用途pass'的'。所以我會習慣它。 – 2010-09-16 02:47:21
「但是我覺得這樣的可讀性差得多......它感覺在本質上是錯誤的」 - 把它看作是一個文化問題。現在看起來很奇怪,但它是使用該語言的最乾淨的方式。 – detly 2010-09-16 04:47:18