为什么这个装饰器首先返回“结果”,然后返回打印语句?

时间:2019-09-15 16:10:33

标签: python

def my_timer(orig_func):
    """returns time orig_func took to run"""
    import time

    def wrapper(*args, **kwargs):
        t1 = time.time()
        result = orig_func(*args, **kwargs)
        t2 = time.time() - t1
        print('{} ran in: {} sec'.format(orig_func.__name__, t2)) # this is interpreted second
        return result # this is interpreted first
    return wrapper

@my_timer
def display_info(name, age):
    print('display_info ran with arguments ({}, {})'.format(name, age))


display_info("Aldona", 22)

我希望这个包装器首先运行print语句,然后返回包含函数值的result变量。为什么不是这种情况?

1 个答案:

答案 0 :(得分:0)

您误会了打印输出的位置。您的display_info函数将打印结果,并且不返回任何有用的信息(默认情况下返回None)。因此,在wrapper中,是orig_func(...)调用导致打印输出发生在与计时相关的print调用之前。

如果您希望输出的顺序符合您的期望,则无需更改装饰代码,而是需要将其构建的字符串从display_info更改为return,然后更改调用代码执行print(display_info(...))。但是然后您可能想要重命名display_info函数,因为它本身不会进行任何显示。...