2016-07-28 34 views
0

Python鼓勵通過顯式類型檢查進行鴨子打字。但是,有時顯式檢查類型是有用的。斷言與庫API類型檢查的例外

當Python庫需要進行類型檢查時,它是否應該使用斷言或異常?

def foo(bar): 
    assert isinstance(bar, str) 

def foo(bar): 
    if not isinstance(bar, str): 
     raise TypeError 

庫的API是公共API,公共API應該明確地引發異常。但是,它不應該是圖書館做用戶輸入驗證的責任(除非它是用戶輸入驗證庫),也不期望圖書館被設計爲「不正確使用」。使用庫的程序不會捕獲TypeError異常;它將被固定爲改爲使用正確的類型調用庫API。

應該使用斷言來完成庫類型檢查而不是引發異常嗎?

+1

我認爲'assert'應作爲一個調試/測試工具。作爲圖書館消費者,我會驚訝地發現斷言失敗。如果我嘗試'導入集合; c = collections.defaultdict(1)'我得到一個TypeError異常而不是斷言失敗;爲什麼標準庫之外的軟件包會有不同的表現? – larsks

+0

你應該做什麼最適合你的情況。顯式類型檢查通常不是必需的,但有時它是處理某些事情的最佳方式。在這種情況下,我會推薦使用'isinstance()',這樣你就可以通過一條消息告訴用戶出了什麼問題。 – IanAuld

回答

-1

斷言評估可以通過使用-O命令行選項運行python來停用,如果您想比生產中檢查更廣泛的東西,這可能很好。

看一看https://wiki.python.org/moin/UsingAssertionsEffectively - 他們知道的比我多,他們說:

地考慮把斷言:

  • 檢查參數類型,類別,或值
  • 檢查數據結構不變量
  • 檢查「不能發生」情況(在列表中重複,矛盾的狀態變量)
  • 調用一個函數後,以確保其回報是合理的