美文网首页
python中@wargs的作用

python中@wargs的作用

作者: 以我丶之姓 | 来源:发表于2021-03-03 15:59 被阅读0次

    装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能。
    @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的方法也没有被改写。

    相关文章

      网友评论

          本文标题:python中@wargs的作用

          本文链接:https://www.haomeiwen.com/subject/wbgqqltx.html