python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。
废话不多说,上俩栗子就能搞明白!

实例一:

不加wraps

# -*- coding=utf-8 -*-
from functools import wraps
def my_decorator(func):
    def wrapper(*args, **kwargs):
        ‘‘‘decorator‘‘‘
        print(‘Calling decorated function...‘)
        return func(*args, **kwargs)
    return wrapper  

@my_decorator
def example():
    """Docstring"""
    print(‘Called example function‘)
print(example.__name__, example.__doc__)

执行结果:

(‘wrapper‘, ‘decorator‘)

  

实例二:

加wraps

# -*- coding=utf-8 -*-
from functools import wraps
def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        ‘‘‘decorator‘‘‘
        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‘)

总结:

warps 作用: 消除(被装饰后的函数名等属性的改变)副作用

原文地址:https://www.cnblogs.com/liangmingshen/p/10206485.html

时间: 2024-08-08 12:11:41

python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变的相关文章

python装饰器的wraps作用

不加: from functools import wraps def my_decorator(func): def wper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wper @my_decorator def example(): """Docstring""" p

python学习之装饰器的wraps作用

未加@wraps # def tag(name):# def decorator(func):# def wrapper(text):# value=func(text)# return "<{name}>{value}</{name}>".format(name=name,value=value)# return wrapper# return decorator## @tag("p")# def my_upper(text):# valu

python装饰器中的@wraps

python装饰器中的@wraps 第一段代码:没有添加@wraps def user_login_confirm(name): print('我是', name) def deco_fun(view_func): print('准备变身...') def wrapper(): view_func() print('变身完成...') return wrapper return deco_fun @user_login_confirm('小辣椒') def tony(): print('我是',

自己编写一个装饰器中的装饰器函数

看了"大道曙光"的<探究functools模块wraps装饰器的用途>的文章.基本上弄清了wraps的工作原理,为了检验一下自己理解的程度,于是动手写一个类似的 wraps函数,请大家指教. #!/usr/bin/env python # -*- coding: utf-8 -*- #filename : mywrapper.py #date: 2017-06-02 ''' wrapper function by my code.''' import functools i

python_如何修改装饰器中参数?

案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改timeout的值 如何解决这个问题? 定义一个装饰器,计算函数执行时间,并与timeout比较,当大于timeout时候,通过logging模块打印出日志信息 在包裹函数中添加一个函数,通过这个函数来修改timeout变量 在python3中用nonlocal来声明嵌套作用域中的变量引用,在pyth

装饰器中的@functools.wraps的作用

def login_required(view_func): @functools.wraps(view_func) def wrapper(*args, **kwargs): ...... return view_func(*args,**kwargs) return wrapper在wrapper上面使用这个装饰器可以让view_func.__name__或者view_func.__doc__访问的还是原先那个函数的对象属性.而不是装饰以后wrapper的对象属性 原文地址:https://

【Python】Flask中@wraps的使用

先说总结,白话来讲,@wraps相当于是装饰器的装饰器. python内置的方法使用解释,看起很复杂的样子┓( ´∀` )┏ def wraps(wrapped, assigned = WRAPPER_ASSIGNMENTS, updated = WRAPPER_UPDATES): """Decorator factory to apply update_wrapper() to a wrapper function Returns a decorator that invo

python装饰器详解,多层装饰器,及带参数的装饰器。

pyhon学习有一段时间了,今天又碰到了Django的中间件,其实Django里面的中间件,就是用了多层的装饰器,然后去了解了一下多层装饰器,感觉有写东西差不多快忘了,也可能前面没学好. 现在重新记录,学习下. 普通装饰器: def warp(func): print('我是装饰器,碰到需要装饰的函数,一开始执行这里') def inner(*args, **kwargs): print('这里才是真正的装饰开始!') res = func(*args, **kwargs) print('装饰结

python 装饰器 三 (带有参数的装饰器)

#接受装饰器的参数 def deco_arg(deco_arg): #接受函数 此列为func1 def deco_func(*argv,**kwag): #接受函数的方法 此列为 a b def _deco_func(*argv,**kwarg): print "before -------执行函数前" print "%s     -------打印装饰器的参数"% deco_arg ret = deco_func(*argv,**kwarg) print &qu