[英]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.