python 装饰器 functools.wraps的用法


def fun1(func):
    @functools.wraps(func)  # 1
    def fun2():
        func()
        print(11)

    return fun2


def fun4(func):
    @functools.wraps(func) # 2
    def fun5():
        print(12)
        func()

    return fun5


@fun4
@fun1
def fun3():
    print(13)


print(fun3.__name__)

同志们 我如果去掉1就会打印fun2 但是我去掉2 去打印的是fun5 为什么呀

基于Monster 组和GPT的调写:
functools.wraps 是一个装饰器,用于将被装饰函数的元信息,如 __name__、__doc__、__module__,等等,复制到装饰器函数中,以便更好地保留被装饰函数的元信息。

在你的代码中,装饰器 fun1 和 fun4 都使用了 functools.wraps,并将被装饰的函数 func 作为参数传递给了 functools.wraps。

如果你去掉 @functools.wraps(func) 中的任何一个,就会影响最终的被装饰函数的元信息。具体来说:

如果你去掉装饰器 fun1 中的 @functools.wraps(func),则 fun3.name 的值将变成 fun2,因为此时 fun2 成为了最终的被装饰函数,而 fun2 是 fun1 中的内部函数。
如果你去掉装饰器 fun4 中的 @functools.wraps(func),则 fun3.name 的值将变成 fun5,因为此时 fun5 成为了最终的被装饰函数,而 fun5 是 fun4 中的内部函数。
因此,无论是装饰器 fun1 还是 fun4 中都必须包含 @functools.wraps(func),以保持最终被装饰函数的元信息正确。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^