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)并得到了函数的执行时间。

谢谢大家。