- functools 的作用是保持被装饰函数的名字不会发生变化,主要应用在项目中,视图函数比较多时,函数路由和视图映射不对应。不说了,还是看代码比较直观。
- eg:
def foo(f):
def wrapper(*args,**kwargs):
f(*args,**kwargs)
return wrapper
def demo():
pass
def start():
pass
if __name__ == '__main__':
print(demo.__name__) # 此时函数名不会发生变化
print(start.__name__)
及装饰器后
def foo(f):
def wrapper(*args,**kwargs):
f(*args,**kwargs)
return wrapper
@foo
def demo():
pass
@foo
def start():
pass
if __name__ == '__main__':
print(demo.__name__) # 此时函数名就变成了装饰器内层函数名wrapper
print(start.__name__)
在这里插入代码片
- 对函数装饰后为了保持原有函数的名称就需要给装饰器内层函数加装饰functools.wraps。
def foo(f):
@functools.wraps(f)
def wrapper(*args,**kwargs):
f(*args,**kwargs)
return wrapper
@foo
def demo():
print("good luck!")
@foo
def start():
print("happy everyday")
if __name__ == '__main__':
print(demo.__name__)
print(start.__name__)