1. 程式人生 > >python引數註解

python引數註解

函式定義的弊端:

python是動態語言,變數隨時可以被賦值,且能賦值為不同的型別,動態語言很靈活,但是這種特性也是弊端

難發現:由於不做任何型別檢查,直到執行期問題才顯現出來,或者線上執行時才能暴露出問 題 

難使用:函式的使用者看到函式的時候,並不知道你的函式的設計,並不知道應該傳入什麼類 型的資料

如何解決這種動態語言的弊端?

函式註解:

python3.5引入, 對函式的引數進行型別註解 ,對函式的返回值進行型別註解 ,只對函式引數做一個輔助的說明,並不對函式引數進行型別檢查 , 提供給第三方工具,做程式碼分析,發現隱藏的bug ,函式註解的資訊,儲存在__annotations__屬性中

 

函式引數型別檢查:

函式引數的檢查一定是在函式外,函式應該作為引數,傳入到檢查函式中,檢查函式拿到函式傳入的實際引數,與形參宣告對比,__annotations__屬性是一個字典,其中包括返回值型別的宣告。假設要做位置引數的判斷,無 法和字典中的宣告對應。使用inspect模組 ,該模組提供獲取物件資訊的函式,可以檢查函式和類,型別檢查。

 

inspect模組

 signature(callable),獲取簽名(函式簽名包含了一個函式的資訊,包括函式名、它的引數型別、它 所在的類和名稱空間及其他資訊) 

 inspect.isfunction(add),是否是函式 

  inspect.ismethod(add)),是否是類的方法 

  inspect.isgenerator(add)),是否是生成器物件 

 inspect.isgeneratorfunction(add)),是否是生成器函式 

inspect.isclass(add)),是否是類 

 還有很多is函式,需要的時候查閱inspect模組幫助

 

Parameter物件:儲存在元組中,是隻讀的 ; name,引數的名字 ; annotation,引數的註解,可能沒有定義 ;default,引數的預設值,可能沒有定義 ;empty,特殊的類,用來標記default屬性或者註釋annotation屬性的空值 ; kind,實參如何繫結到形參,就是形參的型別 

例:檢查使用者輸入是否符合引數註解的要求?

思路:呼叫時,判斷使用者輸入的實參是否符合要求,使用者感覺上還是在呼叫原函式,對使用者輸入的資料和宣告的型別進行對比,如果不符合,提示使用者。