2010-09-15 35 views
9

我讀過有關何時使用斷言與例外,但我仍然沒有「得到它」。好像每當我覺得我是在一個情況下,我應該使用斷言,以後的發展中,我發現,我在「看之前,我的飛躍」,以確保當我打電話功能的斷言不會失敗。既然還有另外一種Python傾向於使用try-except的習慣用法,我通常最終會放棄assert並拋出異常。我還沒有找到一個恰當的地方使用斷言。任何人都可以拿出一些很好的例子嗎?在Python中使用assert的例子?

回答

20

時,其觸發裝置一錯誤代碼中的一個很好的指導使用assert。當你的代碼假定某件事並假設時,建議使用assert來保護這個假設。 assert失敗意味着您的假設不正確,這意味着您的代碼不正確。

3

Generelly,斷言有沒有驗證你對自己的代碼,也就是在那個時間點的假設,無論是斷言成功,或者您的實現在某種程度上馬車。一個例外就是要發生一個錯誤,並「擁抱」它,即允許你處理它。

3

一個很好的例子是檢查函數的參數的一致性:

def f(probability_vector, positive_number): 
    assert sum(probability_vector) == 1., "probability vectors have to sum to 1" 
    assert positive_number >= 0., "positive_number should be positive" 
    # body of function goes here 
+1

有趣 - 我不知道'0.'是簡寫'0.0'。 repl說它是。我可能不會在真實代碼中使用它,儘管它看起來過於「巧妙」,並且很容易被忽略。可以理解爲一個錯字,但0.0總是被理解爲一個浮點數。 – Daenyth 2010-09-15 19:42:15

+0

這似乎與我有一個從2D矩陣中獲取元素的函數相似。斷言行和列輸入實際上在矩陣的範圍內是有意義的。但後來我做了一些事情,我拿了一個元素,想用相鄰元素做點什麼。一旦我開始對它進行編碼,當元素位於邊緣時,我不得不有特殊情況,因爲相鄰元素在矩陣之外。改用異常似乎更好。 – Colin 2010-09-15 19:46:16

+0

異常會如何更容易修改代碼?當你改變函數的行爲時,你仍然需要修改異常提升部分,不是嗎? – pberkes 2010-09-15 19:54:36

15

傾向於使用斷言來檢查的事情,絕不應該發生。有點像健康檢查。

意識到的另一件事是優化時asserts被刪除:

當前的代碼生成器發出無代碼斷言語句時,被要求在編譯時優化。

+4

+1用於指出如果使用'-O'標誌調用Python,那麼斷言將被刪除。關鍵在於,如果你期望*你的代碼的行爲不同,如果你斷言,那麼你濫用它們 - 它們只用於調試。 – 2010-09-15 20:22:21