Python 为什么这个装饰程序首先返回“result”,然后再返回print语句?

Python 为什么这个装饰程序首先返回“result”,然后再返回print语句?,python,Python,我希望这个包装器首先运行print语句,然后返回包含函数值的结果变量。为什么不是这样?您误解了打印输出发生的位置。display_info函数打印其结果,不返回任何有用的内容,默认情况下不返回任何内容。所以在包装器中,它是原始函数。。。使打印输出在计时相关打印调用之前发生的调用 如果希望输出的顺序符合您的期望,则不需要更改装饰器代码,而是需要更改display_info以返回它生成的字符串,并将调用代码更改为do printdisplay_info。。。。但是,您可能需要重命名display_i

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

您误解了打印输出发生的位置。display_info函数打印其结果,不返回任何有用的内容,默认情况下不返回任何内容。所以在包装器中,它是原始函数。。。使打印输出在计时相关打印调用之前发生的调用


如果希望输出的顺序符合您的期望,则不需要更改装饰器代码,而是需要更改display_info以返回它生成的字符串,并将调用代码更改为do printdisplay_info。。。。但是,您可能需要重命名display_info函数,因为它本身不进行任何显示…

它根本不打印结果。这段代码没有一部分说要打印出来。如果是的话,你会在输出中看到一个无。让我试着更精确一些orig_func…'在包装器中调用,并将其值分配给变量“result”,然后使用计时打印语句,然后返回“result”变量。然而,python解释器在“display_info在0.0003秒内运行”之前显示“display_info run with arguments Aldona,22”,您将函数的打印输出与其返回值混淆。当包装器调用函数时,首先打印显示信息。然后包装器的打印就发生了。然后它返回包装函数返回的值,该值为None,并且调用代码会忽略该返回值,而不是打印该值。
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)