[英]Python: Duck-typing vs. Exception Handling
關於idomatic Python的問題。 假設我有一個功能:
def a_function(list_of_things):
for item in list_of_things:
process_item(item)
現在假設我很難確定輸入參數是一個列表。 即使是現在,我也能聽到甜蜜的蟒蛇合唱團懇求我:“使用鴨子打字和例外!”
def a_function(list_of_things):
try:
for item in list_of_things:
process_item(item)
except:
pass # . . . or something
這很好,除非我傳入一個地圖,一個字符串,或其他任何可迭代的方式,我發現這個特定的應用程序是“錯誤的”。
我不會寫很多Python,但我設法經常遇到這個和相關的情況,它經常讓我煩惱。 更一般地說,我想使用duck typing和exception,因為它似乎是Python中的慣例,但在很多情況下可能會得到一個不正確的輸入類型來傳遞我的異常; 如此多,異常似乎是錯誤的答案,而不是(或至少經常)。
即使例外似乎是一個正確的答案,我還害怕,當我使用它們,因為如果我只是還沒有想到的角落情況下不好的類型會過去,離開我的代碼中,由於缺乏一個更好的詞是什么,“躲開”。
所以我最終訴諸於type
和isinstance
type
東西。 從我的閱讀來看,似乎顯式類型檢查在Python中被認為是邪惡的,但還有什么可做的? 請注意,我幾乎從不在Python中編寫類層次結構,所以我沒有子類和類型檢查的問題,但其他人可能會。
我想到了四個可能的答案,所有這些答案對我來說同樣可能:
<python thing for this situation>
? 做一些研究! 是其中之一,還是其他什么?
注意 - 我發現很多關於SO的問題圍繞着這個問題,但是如果可能的話,我正在尋找人們談論這個特定的“類型”問題。
最佳做法是,與類型無關。 for
-loop為任何非可迭代類型引發異常。 文檔應清楚地說明,需要可迭代類型。 使用您的函數的函數應該具有單元測試或集成測試,以便發現意外行為。
類型檢查 - 你正確地提到類型檢查在Python中被認為是邪惡的。 我們應該關心對象的作用,而不是它是什么。 例如 - 如果我迭代輸入,那么我的代碼應該適用於所有迭代,我永遠不應該檢查它的類型。
異常處理 - 讓它拋出異常,如果我們試圖處理它,我們將捕獲所有類型的異常,否則我們將錯過任何異常。
讓我們驗證python內置的行為,我們可以遵循相同的 -
hash(input)如果輸入不能哈希,它將拋出異常 -
散列([1,2])
TypeError:不可用類型:'list'
Dictionary和Set都使用hash()函數。 如果您嘗試使用可變鍵創建字典,它也會拋出相同的異常
{[1,2]:"sample"}
TypeError: unhashable type: 'list'
現在嘗試使用set
set(([1,2], 5,6))
TypeError: unhashable type: 'list'
filter(function_object,any_iterable)`
過濾器(bool,1245)
它將拋出TypeError:'int'對象不可迭代
現在將iter應用於int對象
ITER(1245)
TypeError:'int'對象不可迭代
所以過濾器在內部使用iter()並拋出與iter()相同的異常
`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.