python 装饰器的问题 returns
Problems with python decorators returns
我在使用装饰器时遇到一些问题 return。
我想创建一个装饰器来计算函数持续时间,所以我构建了这段代码来学习如何使用装饰器。
当我将装饰器与 print 方法一起使用时,它可以工作,但这段代码的目的是 return 说明函数名称和持续时间的消息。
import time
def timer(function):
def wrapper(*args, **kwargs):
init_time = time.time()
res = function(*args, **kwargs)
end_time = time.time()
Answer = str(f'The function {function.__name__} takes {end_time - init_time} seconds to be executed.')
print(Answer)
return res
return wrapper
def timer2(function):
def wrapper(*args, **kwargs):
init_time = time.time()
function(*args, **kwargs)
end_time = time.time()
Answer = str(f'The function {function.__name__} takes {end_time - init_time} seconds to be executed.')
return Answer
return wrapper
@timer
def calculator():
soma_tot = 0
for i in range(1,1000000):
soma_tot += 1
return soma_tot
@timer2
def my_name(Name):
print(f'Hello, my name is {Name}')
calculator()
my_name('Leonardo')
所以我遇到了两个问题:
1 - 如果函数 return 是什么,装饰器不是 return 函数 return;
2 - 装饰器只是打印答案,而不是 returning 它以便我可以重复使用答案。
看看timer2
:
def timer2(function):
def wrapper(*args, **kwargs):
init_time = time.time()
function(*args, **kwargs) # Where does the result go?
end_time = time.time()
Answer = str(f'The function {function.__name__} takes {end_time - init_time} seconds to be executed.')
return Answer # You return an unrelated string
return wrapper
然后,
calculator() # What do you do with the return value?
my_name('Leonardo')
事实上,timer2
应该和 timer
完全一样。无需创建新函数。
当您使用 calculator()
时,检查 return 值,您会发现它有效:
res = calculator()
print(res)
伙计们,这是我在你们的帮助下重新编写的代码,现在可以正常工作了。
import time
def timer(function):
def wrapper(*args, **kwargs):
init_time = time.time()
funcReturn = function(*args, **kwargs)
end_time = time.time()
result_time = end_time - init_time
if funcReturn == None:
response={"FunctionName":function.__name__, "TimeSpent":"{:.5f}".format(result_time)}
return response
else:
response={"FunctionReturn":funcReturn, "FunctionName":function.__name__, "TimeSpent":"{:.5f}".format(result_time)}
return response
return wrapper
@timer
def calculator():
soma_tot = 0
for i in range(1,1000000):
soma_tot += 1
return soma_tot
@timer
def my_name(Name):
print(f'Hello, my name is {Name}')
print(calculator())
print(my_name('Leonardo'))
通过这种方式,我得到了函数的结果(打印或return)并得到了函数的执行时间。
谢谢大家。
我在使用装饰器时遇到一些问题 return。 我想创建一个装饰器来计算函数持续时间,所以我构建了这段代码来学习如何使用装饰器。
当我将装饰器与 print 方法一起使用时,它可以工作,但这段代码的目的是 return 说明函数名称和持续时间的消息。
import time
def timer(function):
def wrapper(*args, **kwargs):
init_time = time.time()
res = function(*args, **kwargs)
end_time = time.time()
Answer = str(f'The function {function.__name__} takes {end_time - init_time} seconds to be executed.')
print(Answer)
return res
return wrapper
def timer2(function):
def wrapper(*args, **kwargs):
init_time = time.time()
function(*args, **kwargs)
end_time = time.time()
Answer = str(f'The function {function.__name__} takes {end_time - init_time} seconds to be executed.')
return Answer
return wrapper
@timer
def calculator():
soma_tot = 0
for i in range(1,1000000):
soma_tot += 1
return soma_tot
@timer2
def my_name(Name):
print(f'Hello, my name is {Name}')
calculator()
my_name('Leonardo')
所以我遇到了两个问题:
1 - 如果函数 return 是什么,装饰器不是 return 函数 return;
2 - 装饰器只是打印答案,而不是 returning 它以便我可以重复使用答案。
看看timer2
:
def timer2(function):
def wrapper(*args, **kwargs):
init_time = time.time()
function(*args, **kwargs) # Where does the result go?
end_time = time.time()
Answer = str(f'The function {function.__name__} takes {end_time - init_time} seconds to be executed.')
return Answer # You return an unrelated string
return wrapper
然后,
calculator() # What do you do with the return value?
my_name('Leonardo')
事实上,timer2
应该和 timer
完全一样。无需创建新函数。
当您使用 calculator()
时,检查 return 值,您会发现它有效:
res = calculator()
print(res)
伙计们,这是我在你们的帮助下重新编写的代码,现在可以正常工作了。
import time
def timer(function):
def wrapper(*args, **kwargs):
init_time = time.time()
funcReturn = function(*args, **kwargs)
end_time = time.time()
result_time = end_time - init_time
if funcReturn == None:
response={"FunctionName":function.__name__, "TimeSpent":"{:.5f}".format(result_time)}
return response
else:
response={"FunctionReturn":funcReturn, "FunctionName":function.__name__, "TimeSpent":"{:.5f}".format(result_time)}
return response
return wrapper
@timer
def calculator():
soma_tot = 0
for i in range(1,1000000):
soma_tot += 1
return soma_tot
@timer
def my_name(Name):
print(f'Hello, my name is {Name}')
print(calculator())
print(my_name('Leonardo'))
通过这种方式,我得到了函数的结果(打印或return)并得到了函数的执行时间。
谢谢大家。