python如何為被裝飾的函數保留中繼資料,python中繼資料
本文執行個體為大家分享了python為被裝飾的函數保留中繼資料的具體代碼,供大家參考,具體內容如下
案例:
在函數對象中儲存著一些函數的中繼資料,如:
f.__name__ 函數名
f.__doc__ 函數文檔
f.__moudle__ 函數所屬模組名
f.__dict__ 屬性字典
f.__defaults__ 預設參數組
……
在使用裝飾器後,在裝飾器裡訪問以上屬性時,我們看到的是裝飾器函數的中繼資料
需求:
實現在裝飾器函數中,保留 被裝飾函數 的中繼資料
如何??
通過 functools中的wraps, update_wrapper方法實現,每個都可單獨實現
#!/usr/bin/python3 import timefrom functools import (wraps, update_wrapper, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES) def count_time(func): """ 給目標函數加上計算已耗用時間統計 """ # 這個裝上器和update_wrapper一樣,預設參數WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() # 定義result接收函數傳回值,並且在裝飾函數最後返回回去 resutl = func(*args, **kwargs) print('已耗用時間:', time.time()-start_time) return resutl # 其中預設參數 WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES # update_wrapper(wrapper, func) return wrapper @count_timedef add(num=100): """ 計算 0~num 累加值,預設num=100 """ time.sleep(1) return sum([x for x in range(num+1)]) if __name__ == '__main__': print('函數名:', add.__name__) print('屬性字典:', add.__dict__) print('函數預設參數:', add.__defaults__) print('函數所在模組:', add.__module__) print('函數文檔:', add.__doc__) # 列印兩個預設參數 print(WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES) result = add() print(result)
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。