Python 标准库 functools 里面的 wraps
装饰器经常用于写装饰器,之前只知道它可以用来保留被装饰函数的元数据,但具体实现的方式和究竟保留了哪些数据都不清楚。最近看 Flask 源码时读到一行代码 return self.record(update_wrapper(wrapper, func))
。 稍微看了一下原来 @wraps(func)
其实就是调用了 update_wrapper
这个函数,于是索性看个明白。
一、相关源码
1 | WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__', |
二、源码分析
这段代码其实很简单:
@wraps
默认保留的原来函数的__module__
,__name__
,__qualname__
,__doc__
和__annotations__
数据;@wraps
默认 update 新函数的 dict 属性;@wraps(funcs)
返回的是一个update_wrapper
的 partial, 默认wrapped
参数为传入的func
, 被它装饰的函数作为update_wrapper
的wrapper
参数;update_wrapper
只是 updatewrapper
的元数据,没做其它任何事情。
三、其它收获
try...except...
中 try
的部分应该只包含可能会出错部分的代码,其它的放到 else
中去:
1 | # 正确的方法 |