‘‘‘
预备知识:
……
@decorator
def f(*args,**kwargs):
pass
# 此处@decorator 等价于 f = decorator(f)
@decorator2(*args,**kwargs)
def f2(*args,**kwargs):
pass
# 此处@decorator2(*args,**kwargs) 等价于: 第一步,执行函数decorator2(*args,**kwargs),获得中间结果temp; 第二步,执行装饰器函数(即@temp)
‘‘‘
import functools,time
def log(*args,**kwargs):
def metric(fn):
@functools.wraps(fn)
def t(*args,**kwargs): #计算函数执行消耗的时间
t0 = time.time()
result = fn(*args, **kwargs)
t1 = time.time()
print(‘%s executed in %s ms‘ % (fn.__name__, t1 - t0))
return result
return t
for i in args:
if type(i).__name__ == ‘function‘: #判断传入的参数是函数名称(即log后面没有带参数)
return metric(i) #返回并执行装饰器函数metric(),相当于log是metric的别名。
else: # log后面带普通参数的情形
print(i) # 理论上,log后面可传入无限个参数,如何使用应结合具体情形,本例仅遍历打印,且参数中不包含‘function’类型。
return metric # log后面带普通参数,说明log()是个普通函数,执行log()后,返回装饰器函数的名字metric,再执行metric().
# 测试
@log("execute")
def fast(x, y):
time.sleep(0.0012)
return x + y
@log
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print(‘测试失败!‘)
elif s != 7986:
print(‘测试失败!‘)
原文地址:https://www.cnblogs.com/sqs-cn/p/10697803.html