decorator實現任意引數呼叫
阿新 • • 發佈:2018-12-16
上栗子
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的威力吧。