http://www.cnblogs.com/my_life/articles/7095349.html
http://www.cnblogs.com/my_life/articles/5009959.html
http://www.cnblogs.com/my_life/articles/7094493.html
http://www.cnblogs.com/my_life/articles/5012612.html
http://www.cnblogs.com/Security-Darren/p/4168310.html
6.
functools.wraps(wrapped[, assigned][, updated])
这个函数可以用作一个装饰器,简化调用上一个函数 update_wrapper 的过程。调用这个函数等价于调用 partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated) 。
例如:
>>> from functools import wraps >>> def my_decorator(f): ... @wraps(f) ... def wrapper(*args, **kwds): ... print 'Calling decorated function' ... return f(*args, **kwds) ... return wrapper ... >>> @my_decorator ... def example(): ... """Docstring""" ... print 'Called example function' ... >>> example() Calling decorated function Called example function >>> example.__name__ 'example' >>> example.__doc__ 'Docstring'
可以看到最终调用的 example() 函数是经过 @my_decorator 装饰的,装饰器的作用是接受一个被包裹函数作为参数,对其进行加工,返回一个包裹函数。
代码使用 @functools.wraps 装饰将要返回的包裹函数 wrapper,使得他的 __name__, __doc__ 和 __module__ 属性与被装饰函数 examle()完全相同, 这样虽然最终调用的是经过装饰的 example() 函数,但是某些属性还是得到了维护。