裝飾器,functools,參數註解
阿新 • • 發佈:2018-09-02
uil lru 方便 fff ado 位置參數 nat src 獲取對象 裝飾器(無參)
? 它是一個函數
? 函數作為它的形參
? 返回值也是一個函數
裝飾器和高階函數
? 裝飾器是高階函數,但裝飾器是對傳入函數的功能的裝飾(功能增強)
帶參裝飾器
? 它是一個函數
? 函數作為它的形參
? 返回值是一個不帶參的裝飾器函數
? 使用@functionname(參數列表)方式調用
? 可以看做在裝飾器外層又加了一層函數
函數註解
? Python 3.5引入
? 對函數的參數進行類型註解
? 對函數的返回值進行類型註解
? 只對函數參數做一個輔助的說明,並不對函數參數進行類型檢查
? 提供給第三方工具,做代碼分析,發現隱藏的bug
? 函數註解的信息,保存在annotations屬性中
函數參數類型檢查
? 思路
? 函數參數的檢查,一定是在函數外
? 函數應該作為參數,傳入到檢查函數中
? 檢查函數拿到函數傳入的實際參數,與形參聲明對比
? annotations屬性是一個字典,其中包括返回值類型的聲明。假設要做位置參數的判斷,無
法和字典中的聲明對應。使用inspect模塊
inspet模塊
? 提供獲取對象信息的函數,可以檢查函數和類、類型檢查
signature(callable),獲取簽名(函數簽名包含了一個函數的信息,包括函數名、它的參數類型、它所在的類和名稱空間及其他信息)
? inspect.isfunction(add),是否是函數
? inspect.ismethod(add)),是否是類的方法
? inspect.isgenerator(add)),是否是生成器對象
? inspect.isgeneratorfunction(add)),是否是生成器函數
? inspect.isclass(add)),是否是類
? inspect.ismodule(inspect)),是否是模塊
? inspect.isbuiltin(print)),是否是內建對象
Parameter對象
? 保存在元組中,是只讀的
? name,參數的名字
? annotation,參數的註解,可能沒有定義
? default,參數的缺省值,可能沒有定義
? empty,特殊的類,用來標記default屬性或者註釋annotation屬性的空值
? kind,實參如何綁定到形參,就是形參的類型
functools模塊
? reduce方法
? reduce方法,顧名思義就是減少
? 可叠代對象不能為空;初始值沒提供就在可叠代對象中取一個元素
partial方法
? 偏函數,把函數部分的參數固定下來,相當於為部分的參數添加了一個固定的默認值,形成一
個新的函數並返回
? 從partial生成的新函數,是對原函數的封裝
lru_cache裝飾器
? 通過一個字典緩存被裝飾函數的調用和返回值
裝飾器應用練習
? 二、寫一個命令分發器
? 程序員可以方便的註冊函數到某一個命令,用戶輸入命令時,路由到註冊的函數
? 如果此命令沒有對應的註冊函數,執行默認函數
? 用戶輸入用input(">>")
? 它是一個函數
? 函數作為它的形參
? 返回值也是一個函數
裝飾器和高階函數
? 裝飾器是高階函數,但裝飾器是對傳入函數的功能的裝飾(功能增強)
帶參裝飾器
? 它是一個函數
? 函數作為它的形參
? 返回值是一個不帶參的裝飾器函數
? 使用@functionname(參數列表)方式調用
? 可以看做在裝飾器外層又加了一層函數
函數註解
? Python 3.5引入
? 對函數的參數進行類型註解
? 對函數的返回值進行類型註解
? 只對函數參數做一個輔助的說明,並不對函數參數進行類型檢查
? 提供給第三方工具,做代碼分析,發現隱藏的bug
? 函數註解的信息,保存在annotations屬性中
函數參數類型檢查
? 函數參數的檢查,一定是在函數外
? 函數應該作為參數,傳入到檢查函數中
? 檢查函數拿到函數傳入的實際參數,與形參聲明對比
? annotations屬性是一個字典,其中包括返回值類型的聲明。假設要做位置參數的判斷,無
法和字典中的聲明對應。使用inspect模塊
inspet模塊
? 提供獲取對象信息的函數,可以檢查函數和類、類型檢查
signature(callable),獲取簽名(函數簽名包含了一個函數的信息,包括函數名、它的參數類型、它所在的類和名稱空間及其他信息)
? inspect.isfunction(add),是否是函數
? inspect.ismethod(add)),是否是類的方法
? inspect.isgeneratorfunction(add)),是否是生成器函數
? inspect.isclass(add)),是否是類
? inspect.ismodule(inspect)),是否是模塊
? inspect.isbuiltin(print)),是否是內建對象
Parameter對象
? 保存在元組中,是只讀的
? name,參數的名字
? annotation,參數的註解,可能沒有定義
? default,參數的缺省值,可能沒有定義
? empty,特殊的類,用來標記default屬性或者註釋annotation屬性的空值
functools模塊
? reduce方法
? reduce方法,顧名思義就是減少
? 可叠代對象不能為空;初始值沒提供就在可叠代對象中取一個元素
partial方法
? 偏函數,把函數部分的參數固定下來,相當於為部分的參數添加了一個固定的默認值,形成一
個新的函數並返回
? 從partial生成的新函數,是對原函數的封裝
lru_cache裝飾器
? 通過一個字典緩存被裝飾函數的調用和返回值
裝飾器應用練習
? 二、寫一個命令分發器
? 程序員可以方便的註冊函數到某一個命令,用戶輸入命令時,路由到註冊的函數
? 如果此命令沒有對應的註冊函數,執行默認函數
? 用戶輸入用input(">>")
裝飾器,functools,參數註解