1. 程式人生 > >python_為被裝飾的函數保留元數據

python_為被裝飾的函數保留元數據

對象 size 計算 函數名 pre 通過 doc 接收 num

案例:

在函數對象中保存著一些函數的元數據,如:

f.__name__ 函數名

f.__doc__ 函數文檔

f.__moudle__ 函數所屬模塊名

f.__dict__ 屬性字典

f.__defaults__ 默認參數組

……

在使用裝飾器後,在裝飾器裏訪問以上屬性時,我們看到的是裝飾器函數的元數據

需求:

實現在裝飾器函數中,保留 被裝飾函數 的元數據

如何實現?

通過 functools中的wraps, update_wrapper方法實現,每個都可單獨實現

#!/usr/bin/python3

import time
from 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_time
def 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)

  

python_為被裝飾的函數保留元數據