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),以保持最终被装饰函数的元信息正确。