给一个函数添加装饰器
给函数添加一个包装,以添加额外功能(比如计时、记录日志等等)
def outer(func):
def inner(*args, **kwargs):
print('{} is called'.format(func.__name__) )
res = func(*args, **kwargs)
print(res)
return res
return inner
@outer
def add(a, b):
“”“this a add function”“”
return a + b
add(1,2)
结果
add is called
3
如何保存被装饰函数的元数据(附底层原理,需要一定的功底)
上面我们定义了一个装饰器,并将它作用在add函数上,但是有一个问题,被装饰过add函数一些重要元数据被丢失了,比如函数名、函数文档等等
print(add.__name__)
print(add.__doc__)
结果
inner
None
这是因为被装饰过之后,add这个变量名已经指向装饰器的内部的inner函数对象了,所以才有上面的结果
如果想保存被装饰函数的元数据,需要为装饰器的内部函数也添加一个装饰器,它是位于python标准库的functools
模块中的wraps
函数
from functools import wraps
def outer(func):
@wraps(func)
def inner(*args, **kwargs):
print('{} is called'.format(func.__name__))
res = func(*args, **kwargs)
print(res)
return res
return inner
@outer
def add(a, b):
"""this is a add function"""
return a + b
add(1, 2)
print('==============')
print(add.__name__)
print