# 带参装饰器
# 文档字符串
def add(x, y):
"""
add function
x: int
y: int
return : int
"""
# pass
# print(add.__name__, add.__doc__)
# help(sum)
# def copy_properties(dst, src):
# src.__name__ = dst.__name__
# src.__doc__ = dst.__doc__
def copy_properties(src):
def c_wrapper(dst):
dst.__name__ = src.__name__
dst.__doc__ = src.__doc__
return dst
return c_wrapper
import time
import datetime
from functools import wraps
def logger(fn):
# 引出带参装饰器 wrapper = copy_properties(fn)(wrapper) # add(x,y) ==> add(x)(y) 柯里化
# wrapper = c_wrapper(wrapper) => new_wrapper
# @copy_properties(fn)
# @wraps(fn)
def wrapper(*arg, **kwargs):
"""
wrapper function doc
"""
# print("调用前的增强功能")
start = datetime.datetime.now()
ret = fn(*arg,**kwargs) # 意思就是把参数 原封不动的传递给fn, 二传手
delta = (datetime.datetime.now() - start).total_seconds()
print(f"function {fn.__name__} took {delta:.2f} seconds")
# print("调用后的增强功能")
return ret
# copy_properties(fn, wrapper)
# wrapper.__name__ = fn.__name__
# wrapper.__doc__ = fn.__doc__
return wrapper #包裹
@logger #装饰器 my_sum = logger(my_sum) =》wrapper
def my_sum(x,y,z,t, **kwargs):
"""
my_sum function doc
"""
# print(kwargs)
time.sleep(3)
return x + y+ z + t
print(my_sum.__name__, my_sum.__doc__)