用Python functools.wraps实现装饰器
2016-12-10 11:57
585 查看
转载:http://blog.sina.com.cn/s/blog_3fe961ae0102v1xg.html#
Python装饰器(decorator)在实现的时候,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)。这样有时候会对程序造成一些不便,例如笔者想对unittest框架中的一些函数添加自定义的decorator,添加后由于函数名和函数的doc发生了改变,对测试结果有一些影响。
所以,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。例如:
# -*- coding=utf-8 -*-
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Calling decorated function...')
return func(*args, **kwargs)
return wrapper @my_decorator
def example():
"""Docstring"""
print('Called example function')
print(example.__name__, example.__doc__)
打印出:example Docstring
Python装饰器(decorator)在实现的时候,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)。这样有时候会对程序造成一些不便,例如笔者想对unittest框架中的一些函数添加自定义的decorator,添加后由于函数名和函数的doc发生了改变,对测试结果有一些影响。
所以,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。例如:
test_decorator.py |
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Calling decorated function...')
return func(*args, **kwargs)
return wrapper @my_decorator
def example():
"""Docstring"""
print('Called example function')
print(example.__name__, example.__doc__)
打印出:example Docstring
相关文章推荐
- Python 中实现装饰器时使用 @functools.wraps 的理由
- 用Python functools.wraps实现装饰器
- python 装饰器及标准库functools中的wraps
- Python 装饰器之 functools.wraps
- Python 装饰器之 functools.wraps
- python 9-2 如何为被装饰的函数保存元数据,使用标准库functools中的装饰器wraps 装饰内部包裹函数
- Python 入门:装饰器(decorator)、@functools.wraps、@staticmethod、@classmethod
- python学习笔记2-functools.wraps 装饰器
- python 理解functools.wraps
- python functools 实现列表排序
- python中functools.wraps的作用
- What does functools.wraps do?
- [tools]excel转lua的python实现
- Python技巧——list comprehension 与 functools.reduce
- python学习系列之python装饰器基础(4)---装饰器实现token验证功能
- functools.wraps
- Python functools详解
- Python闭包的高级应用-装饰器的实现
- python functools
- python的functools.partial用法解释