python中@wargs的作用

2021-03-03  本文已影响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的方法也没有被改写。

上一篇下一篇

猜你喜欢

热点阅读