1. 程式人生 > >decorator實現任意引數呼叫

decorator實現任意引數呼叫

上栗子


import time, functools
from inspect import isfunction

def run_time(param):
    text = None
    
    # run_time 無引數時呼叫
    def decorator_text(param):
        return decorator(param)

    # 用wrapper儲存執行 func(*args, **kwargs)
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print('Starting call {}'.format(wrapper.__name__))
            start = time.time()
            func(*args, **kwargs)
            end = time.time()
            print('Ending call {}'.format(wrapper.__name__))
            return 'Run_time param is {2}\nExecute {0} used {1}'.format(wrapper.__name__, end - start, text)
        return wrapper
 
    # 引數識別
    if isfunction(param):
        return decorator(param)
    else:
        text = param
        return decorator_text

發現一點問題,在返回下一步操作時

如果不是直接呼叫函式而是返回函式變數(wrapper操作?),將會儲存當前引數,

並在接下來需要新引數時自動接收下一級引數,不會與當前引數混淆。

大概這就是wrapper的威力吧。