簡體   English   中英

Python 中函數參數的有效性檢查:每個函數都應該這樣做嗎?

[英]Validity check of function arguments in Python: should every function do it?

每個 Python 函數(或方法)都應該檢查其參數的有效性嗎?

不僅僅是類型,而且如果值在有效范圍內,尺寸是否符合預期等?

或者可以只擁有簡單地期望來自其他函數、程序員等的“成人式”行為良好的函數? 只需在文檔字符串中提及預期內容,並在面向用戶的函數中檢查用戶輸入參數的有效性?

在“私有”方法的情況下,在我看來我們不需要檢查有效性,但是其他方法/函數呢?

如果我們對此過於嚴格並檢查所有內容,代碼會不會充滿無聊的裝飾器類型代碼? 可以嗎?

Python 鼓勵打字或“請求寬恕比許可更容易”(EAFP),這意味着您應該假設您的論點是正確的,如果不是,則適當地處理這種情況。

我們假設“如果它像鴨子一樣走路和說話,那么它一定是一只鴨子”。 看這里:

class Duck:
    def quack(self):
        return 'quack!'

class Person:
    def quack(self):
        return 'Hey there!'

d = Duck()
p = Person()

def make_it_quack(duck):
    return duck.quack()

print(make_it_quack(d))
print(make_it_quack(p))

如您所見,這兩種類型都有效。 這是故意行為。 如果您遇到未定義該方法的內容,您將按預期獲得AttributeError 解決這個問題的方法是使用異常處理:

try:
   print(make_it_quack(d))
    print(make_it_quack(p))
    print(make_it_quack('hello world'))
except AttributeError:
    print('object must have a "quack" method')

說了這么多,我個人並沒有一直堅持下去。 例如,如果我不能保證我的對象的類型,那么我將使用if isinstance(x, Y)來正確引導代碼。 如果沒有,那么它會回來try except

您可以自行決定選擇哪一種使您的代碼更簡潔並適合這種情況。 有關於此的建議,例如“始終使用 try/except for IOErrors”(這背后是有原因的)。

我認為這可以適用於一般情況,而不僅僅是適用於 Python,但我認識的所有人都遵循這樣的理念:如果可能發生的最壞情況是錯誤消息,則假設輸入將是正確的。
除非你的代碼正在運行一個任務,即使你已經盡可能安全地編寫它,它仍然可以破壞某些東西,在這種情況下總是檢查。

我見過很多不同的方法。 最極端的一個是文檔字符串包含參數類型和范圍(也返回值)的正式聲明。 應用程序在運行時根據這些文檔字符串檢查參數,並在它們出現問題時拋出異常。 這是使用元編程實現的,可以在生產運行中禁用。

它不再是真正的 Python,也不可能使用鴨子類型。 它更像是一種沒有幫助編譯器的靜態類型語言。 您仍然必須等到它在運行時中斷。

我還見過不做任何檢查而只運行綜合單元測試的應用程序。 如果它們通過,則假定參數也正常。

就我個人而言,我也用單元測試涵蓋了大部分內容,但在關鍵部分我使用斷言。 我還特別注意接收用戶輸入的方法。

希望有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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