函數定義的弊端:
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,實參如何綁定到形參,就是形參的類型
例:檢查用戶輸入是否符合參數注解的要求?
思路:調用時,判斷用戶輸入的實參是否符合要求,用戶感覺上還是在調用原函數,對用戶輸入的數據和聲明的類型進行對比,如果不符合,提示用戶。

