被装饰的函数保存元数据

Posted miss_林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了被装饰的函数保存元数据相关的知识,希望对你有一定的参考价值。

函数被装饰器装饰后会失去原本的属性和元数据,为了保存原因的元数据,使用functools下的wraps下的装饰器

未使用装饰器装饰时:

def mydecorator(fun):

    def wrap(*args):
        print I am mydecorator
        fun(*args)
    return wrap()


def example():

    print sdsdsd

print example.__name__
print example.__doc__

运行结果:

example
None

使用装饰器后

def mydecorator(fun):

    def wrap(*args):
        print I am mydecorator
        fun(*args)
    return wrap()


@mydecorator
def example():

    print sdsdsd

print example.__name__
print example.__doc__

运行结果:name的属性为装饰器的属性

wrap
None

 

加入装饰器后:

from functools import update_wrapper, wraps, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES


def mydecorator(func):
    @wraps(func) #使用装饰器,同样有assigned=(),updated=()有默认值WRAPPER_ASSIGNMENTS和 WRAPPER_UPDATES
    def wrap(*args, **kwargs):
        print I am mydecorator
        func(*args, **kwargs)
    ‘‘‘第一种,保持原来的元组数据‘‘‘
    #update_wrapper(wrap, func,assigned=(),updated=()) 这两个assigned=(),updated=()有默认值WRAPPER_ASSIGNMENTS和 WRAPPER_UPDATES
    return wrap


@mydecorator
def example():

    print sdsdsd

print example.__name__
print example.__doc__

print WRAPPER_ASSIGNMENTS
print WRAPPER_UPDATES
 

 

结果:

example
None
(‘__module__‘, ‘__name__‘, ‘__doc__‘)
(‘__dict__‘,)

 

以上是关于被装饰的函数保存元数据的主要内容,如果未能解决你的问题,请参考以下文章

python_为被装饰的函数保留元数据

python使用上下文对代码片段进行计时,非装饰器

装饰器

Angular装饰器介绍

有没有办法通过嵌套提供者获取函数装饰器元数据?

Python元编程