2011-01-24 78 views
2

我無法在SO上找到答案,但很可能該論點已經被討論過了。如何處理動態語言中的錯誤參數類型?

我想用Python語言編寫一個相當小的程序。這是我對動態語言的第一次「真實」體驗,我寧願以正確的方式做所有事情。從一開始我嘗試應用的一種做法是單元測試。

如何快速測試方法的參數是否正確?我應該這樣做嗎?

與正確的類型我的意思是例如檢查與浮點數一起使用的方法不用字符串調用。在這種情況下,考慮方法應該顯然接受甚至整數的可能性,而不僅僅是漂浮。

回答

3

如何快速測試方法的參數是正確的類型?

最快的方法是什麼都不做。

說真的。動態語言解釋器(在這種情況下是Python)將比您可以編寫的任何代碼檢查得更快。它只會引發異常,這就是你需要做的。沒有。

我應該這樣做嗎?

永遠不要測試正確的類型。一般情況下,你不能這樣做。

假設你有一個需要「一把手」

def some_func(x): 
    assert isinstance(x, int) 

政策利空的功能。您的函數可能會長時間工作,也可能會像int一樣浮動。

assert instance(x, (int, long, float)) 

糟糕的政策。你仍然排除複雜。事實上,你也排除了decimal.Decimalfractions.Rational這也是有效的數字。

通過「類型檢查」你將排除有效的類型。你可以做的唯一事情就是假設類型是正確的,並且當有人「誤用」你的函數或類並提供錯誤類型時會優雅地處理異常。

最優美的方式來處理TypeError

什麼都不做。程序應該完全崩潰。

1

完全覆蓋的單元測試實際上是處理任何依賴於動態語言的開發工作的唯一方法。顯然,對靜態類型語言進行強大的覆蓋率測試是非常有益的,但根據我的經驗,當您進行動態輸入時,這一點更爲重要。

如果你沒有覆蓋可以在你的測試中運行的所有代碼,那麼你確實是在尋求麻煩。所以你想使用一個覆蓋率分析工具與你的單元測試結合使用來證明你已經達到了你的所有代碼。即使這樣也不能防範所有的缺陷 - 你的測試確實需要鍛鍊你的程序可能收到的所有可能錯誤的輸入數據錯誤。

3

您不應測試特定類型。根據docs,您應該根據需要簡單地使用傳入的對象,併爲用戶提供提供自定義實現的機會。

取決於你的函數做什麼,它可能給參數轉換爲預期的類型是適當的:

def my_func(a): 
    a = float(a) 
    # ...do stuff... 

另一個很好的選擇是使用hasattr()使用前檢查所需的成員。這會讓你拋出一個有用的異常,而不是默認的AttributeError。

+2

「理想狀態」可以刪除。你不要爲類型進行「測試」。解釋器測試類型。你只是使用這個對象。 –