簡體   English   中英

Python:Duck-typing與異常處理

[英]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中的慣例,但在很多情況下可能會得到一個不正確的輸入類型來傳遞我的異常; 如此多,異常似乎是錯誤的答案,而不是(或至少經常)。

即使例外似乎是一個正確的答案,我還害怕,當我使用它們,因為如果我只是還沒有想到的角落情況下不好的類型會過去,離開我的代碼中,由於缺乏一個更好的詞是什么,“躲開”。

所以我最終訴諸於typeisinstance type東西。 從我的閱讀來看,似乎顯式類型檢查在Python中被認為是邪惡的,但還有什么可做的? 請注意,我幾乎從不在Python中編寫類層次結構,所以我沒有子類和類型檢查的問題,但其他人可能會。

我想到了四個可能的答案,所有這些答案對我來說同樣可能:

  1. 你應該使用例外,但你做錯了。 像這樣做 。
  2. 你應該使用例外。 如果不良類型通過您的支票,則表明您的設計存在一些問題(什么問題?)
  3. 你正在做正確的事。 在這些情況下,最好使用顯式類型檢查。
  4. 你不知道<python thing for this situation> 做一些研究!

是其中之一,還是其他什么?

注意 - 我發現很多關於SO的問題圍繞着這個問題,但是如果可能的話,我正在尋找人們談論這個特定的“類型”問題。

最佳做法是,與類型無關。 for -loop為任何非可迭代類型引發異常。 文檔應清楚地說明,需要可迭代類型。 使用您的函數的函數應該具有單元測試或集成測試,以便發現意外行為。

類型檢查 - 你正確地提到類型檢查在Python中被認為是邪惡的。 我們應該關心對象的作用,而不是它是什么。 例如 - 如果我迭代輸入,那么我的代碼應該適用於所有迭代,我永遠不應該檢查它的類型。

異常處理 - 讓它拋出異常,如果我們試圖處理它,我們將捕獲所有類型的異常,否則我們將錯過任何異常。

讓我們驗證python內置的行為,我們可以遵循相同的 -

  1. 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'
  1. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM