update_wrapper
def update_wrapper(wrapper, wrapped,assigned = WRAPPER_ASSIGNMENTS,updated = WRAPPER_UPDATES):
- 类似copy_properties功能
- wrapper 包装函数、被更新者,wrapped 被包装函数、数据源
- 元组WRAPPER_ASSIGNMENTS中是要被覆盖的属性【'__module__', '__name__', '__qualname__', '__doc__', '__annotations__'】模块名、名称、限定名、文档、参数注解
- 元组WRAPPER_UPDATES中是要被更新的属性,__dict__属性字典
- 增加一个__wrapped__属性,保留着wrapped函数
import functools def logger(fn): def loger(*args,**kwargs): "This funation logger" print("函数开始运行") ret = fn(*args,**kwargs) print("函数结束") return ret functools.update_wrapper(loger,fn) return loger @logger def add(x,y): ''' This is funation add ''' return x + y print(add(3,6),add.__name__,add.__doc__) print(add.__wrapped__(4,6)) 结果: 函数开始运行 函数结束 9 add This is funation add 10
wraps
@functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
- 类似copy_doc功能
- wrapped 被包装函数
- 元组WRAPPER_ASSIGNMENTS中是要被覆盖的属性【'__module__', '__name__', '__qualname__', '__doc__', '__annotations__'】模块名、名称、限定名、文档、参数注解
- 元组WRAPPER_UPDATES中是要被更新的属性,__dict__属性字典
- 增加一个__wrapped__属性,保留着wrapped函
import functools def logger(fn): @functools.wraps(fn) def loger(*args,**kwargs): "This funation logger" print("函数开始运行") ret = fn(*args,**kwargs) print("函数结束") return ret return loger @logger def add(x,y): ''' This is funation add ''' return x + y print(add(3,6),add.__name__,add.__doc__) print(add.__wrapped__(4,6)) 结果: 函数开始运行 函数结束 9 add This is funation add 10