2011-09-04 80 views
2

在下面的代碼中,我使用的是assert是否合理?如果有任何錯誤,當我嘗試訪問屬性時會發生錯誤。另一方面,assert提供了一個描述性的錯誤信息。Pythonic處理這個錯誤的案例

你認爲我應該保持斷言嗎?

class WeakBoundMethod: 
    def __init__(self, meth): 
     assert (hasattr(meth, '__func__') and hasattr(meth, '__self__')),\ 
       'Object is not a bound method.' 

     self._self = weakref.ref(meth.__self__) 
     self._func = meth.__func__ 

回答

1

在我看來,這裏assert正在檢查代碼所做的假設。如果課程使用不正確(即編程錯誤),它將失敗。

如果確實如此,那麼在這裏使用assert是恕我直言的理由。當然,如果使用不當,Python會慷慨地拋出異常,EAFP是一個好策略。然而,有時候解釋者所引發的錯誤並不足以使問題的定位變得容易,在這種情況下,assert是合適的。它還應與適當的文件相結合,說明班級期望如何使用(即通過的方法應具有某些屬性)。


如果我誤解你的樣本,您使用的assert這裏來驗證東西用戶能夠與犯錯,那麼它是不是一個好主意。

+0

是的,這就是我使用代碼的方式。我也寫了文檔。整個班級可以在這裏找到:http://codereview.stackexchange.com/questions/4574 –

+0

@Paul:[免責聲明]沒有仔細閱讀整個班級,我認爲'assert'沒有問題 –

+0

對於downvoter:請解釋你不同意的內容。由於這個問題需要一些判斷和意見/個人喜好,我認爲討論很有趣。 –

4

assert輸入驗證,它是用於查找建立在你的代碼中的假設缺陷。這是一個調試和文檔工具,但它可以被禁用。如果你想提供一個好的錯誤信息,raise TypeError("Object is not a bound method") - 這就是它的用途。

+0

但我不使用它在這裏進行輸入驗證。我正在檢查由於程序員而只能發生的錯誤情況。還是我斷言錯誤? –

+0

@Paul:方法參數**是**輸入。不是*用戶*輸入,但仍然是輸入,因爲它來自不總是可信的來源,以提供可用的數據,因此需要驗證。另外,'TypeError'對於程序員來說更具描述性。 – delnan

+0

但是,如果程序員犯了一個錯誤,它只會是錯誤的輸入,它不能來自用戶。這不是什麼斷言? –