python装饰器修饰的函数的return值是否只能是Nonetype
Whether the return value of a function modified by python decorator can only be Nonetype
我写了一个装饰器来获取程序的运行时间,但是函数return值变成了Nonetype
def gettime(func):
def wrapper(*args, **kw):
t1 = time.time()
func(*args, **kw)
t2 = time.time()
t = (t2-t1)*1000
print("%s run time is: %.5f ms"%(func.__name__, t))
return wrapper
如果我不使用装饰器,return 值是正确的。
A = np.random.randint(0,100,size=(100, 100))
B = np.random.randint(0,100,size=(100, 100))
def contrast(a, b):
res = np.sum(np.equal(a, b))/(A.size)
return res
res = contrast(A, B)
print("The correct rate is: %f"%res)
结果是:The correct rate is: 0.012400
如果我使用装饰器:
@gettime
def contrast(a, b):
res = np.sum(np.equal(a, b))/len(a)
return res
res = contrast(A, B)
print("The correct rate is: %f"%res)
会有报错:
contrast run time is: 0.00000 ms
TypeError: must be real number, not NoneType
当然,如果我删除 print
语句,我可以获得正确的 运行 时间,但是 res
接受 Nonetype。
由于包装器替换了修饰的函数,它还需要传递return值:
def wrapper(*args, **kw):
t1 = time.time()
ret = func(*args, **kw) # save it here
t2 = time.time()
t = (t2-t1)*1000
print("%s run time is: %.5f ms"%(func.__name__, t))
return ret # return it here
或者你可以这样做:
def gettime(func):
def wrapper(*args, **kw):
t1 = time.time()
func(*args, **kw)
t2 = time.time()
t = (t2-t1)*1000
print("%s run time is: %.5f ms"%(func.__name__, t))
print("The correct rate is: %f"%func(*args,**kw))
return wrapper
@gettime
def contrast(a, b):
res = np.sum(np.equal(a, b))/a.size
return res
contrast(A,B)
我写了一个装饰器来获取程序的运行时间,但是函数return值变成了Nonetype
def gettime(func):
def wrapper(*args, **kw):
t1 = time.time()
func(*args, **kw)
t2 = time.time()
t = (t2-t1)*1000
print("%s run time is: %.5f ms"%(func.__name__, t))
return wrapper
如果我不使用装饰器,return 值是正确的。
A = np.random.randint(0,100,size=(100, 100))
B = np.random.randint(0,100,size=(100, 100))
def contrast(a, b):
res = np.sum(np.equal(a, b))/(A.size)
return res
res = contrast(A, B)
print("The correct rate is: %f"%res)
结果是:The correct rate is: 0.012400
如果我使用装饰器:
@gettime
def contrast(a, b):
res = np.sum(np.equal(a, b))/len(a)
return res
res = contrast(A, B)
print("The correct rate is: %f"%res)
会有报错:
contrast run time is: 0.00000 ms
TypeError: must be real number, not NoneType
当然,如果我删除 print
语句,我可以获得正确的 运行 时间,但是 res
接受 Nonetype。
由于包装器替换了修饰的函数,它还需要传递return值:
def wrapper(*args, **kw):
t1 = time.time()
ret = func(*args, **kw) # save it here
t2 = time.time()
t = (t2-t1)*1000
print("%s run time is: %.5f ms"%(func.__name__, t))
return ret # return it here
或者你可以这样做:
def gettime(func):
def wrapper(*args, **kw):
t1 = time.time()
func(*args, **kw)
t2 = time.time()
t = (t2-t1)*1000
print("%s run time is: %.5f ms"%(func.__name__, t))
print("The correct rate is: %f"%func(*args,**kw))
return wrapper
@gettime
def contrast(a, b):
res = np.sum(np.equal(a, b))/a.size
return res
contrast(A,B)