用Python functools.wraps實現裝飾器

輕舟輕發表於2016-12-10

轉載:http://blog.sina.com.cn/s/blog_3fe961ae0102v1xg.html#

Python裝飾器(decorator)在實現的時候,有一些細節需要被注意。例如,被裝飾後的函式其實已經是另外一個函式了(函式名等函式屬性會發生改變)。這樣有時候會對程式造成一些不便,例如筆者想對unittest框架中的一些函式新增自定義的decorator,新增後由於函式名和函式的doc發生了改變,對測試結果有一些影響。

所以,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現之前加上functools的wrap,它能保留原有函式的名稱和docstring。例如:

test_decorator.py

# -*- 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


相關文章