python中@wargs的作用

装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能。
@wraps(view_func)的作用: 防止改变使用装饰器后原有函数的结构(如name, doc等等)
1、未使用装饰器

def test(func):
    def wrapper(*args, **kwargs):
        '''我是打算用来当装饰器的函数2'''
        print('args: ', args)
        print('kwargs:', kwargs)
        args = (11,22,33)
        kwargs['name'] = 'Test_c'
        return func(*args, **kwargs)
    return wrapper

def func_test(*args, **kwargs):
    '''我是演示函数1'''
    print('我是测试函数')
    print('---',args, kwargs)

func_test(1,2,3,a=123,b=456)
print('*'*20)
print(func_test.__name__)
print(func_test.__doc__)
print('*'*20)

输出结果为:
我是测试函数
--- (1, 2, 3) {'a': 123, 'b': 456}
********************
func_test
我是演示函数1
********************

2、用装饰器但是未用@wargs

def test(func):
    def wrapper(*args, **kwargs):
        '''我是打算用来当装饰器的函数2'''
        print('args: ', args)
        print('kwargs:', kwargs)
        args = (11,22,33)
        kwargs['name'] = 'Test_c'
        return func(*args, **kwargs)
    return wrapper

@test
def func_test(*args, **kwargs):
    '''我是演示函数1'''
    print('我是测试函数')
    print('---',args, kwargs)

func_test(1,2,3,a=123,b=456)
print('*'*20)
print(func_test.__name__)
print(func_test.__doc__)
print('*'*20)

输出结果为:
args:  (1, 2, 3)
kwargs: {'a': 123, 'b': 456}
我是测试函数
--- (11, 22, 33) {'a': 123, 'b': 456, 'name': 'Test_c'}
********************
wrapper
我是计划用来当做装饰器的函数2
********************
注意:很明显演示函数1的方法被改写了,这不是我们想要的结果

3、使用@wargs后

from functools import wraps

def test(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        '''我是计划用来当做装饰器的函数2'''
        print('args: ', args)
        print('kwargs:', kwargs)
        args = (11,22,33)
        kwargs['name'] = 'Test_c'
        return func(*args, **kwargs)
    return wrapper
@test
def func_test(*args, **kwargs):
    '''我是演示函数1'''
    print('我是测试函数')
    print('---',args, kwargs)

func_test(1,2,3,a=123,b=456)
print('*'*20)
print(func_test.__name__)
print(func_test.__doc__)
print('*'*20)

输出结果为:
args:  (1, 2, 3)
kwargs: {'a': 123, 'b': 456}
我是测试函数
--- (11, 22, 33) {'a': 123, 'b': 456, 'name': 'Test_c'}
********************
func_test
我是演示函数1
********************

可见装饰器函数也执行了,同时演示函数1的方法也没有被改写。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 3,856评论 0 27
  • 1.元类 1.1.1类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这...
    TENG书阅读 1,362评论 0 3
  • 一直没有开Python相关的文章。本文从零开始,整理一下Python的基础语法。其余相关内容慢慢增加。内容主要参考...
    fatesnight阅读 508评论 0 0
  • 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返...
    萧十一郎456阅读 356评论 0 0
  • 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,...
    chen_000阅读 1,383评论 0 3