Python---装饰器关键字参数

装饰器中使用了可变参数列表,就可以支持了不同函数中有不同参数个数的情况,要是函数中有关键字参数嘞,那该如何定义:

先看关键字参数的用法:用双星号**定义关键字参数

def f3(func_name1,func_name2,**kw):
    print(func_name1+func_name2)
    print(kw)

f3('test,','test2',a=1,b=2,c='123')
-----------------------------------------------
输出:

test,test2
{'a': 1, 'b': 2, 'c': '123'}

且看定义的f3使用装饰器:

import time
def decorator(func):
    def wrapper(*args):
        print(time.time())
        func(*args)
    return wrapper
decorator
def f1(func_name):
    print('Hello world!' + func_name)

@decorator
def f2(func_name1,func_name2):
    print(func_name1+func_name2)


@decorator
def f3(func_name1,func_name2,**kw):
    print(func_name1+func_name2)
    print(kw)


f3('test,','test2',a=1,b=2,c='123')
--------------------------------------------------
输出:
Traceback (most recent call last):
  File "E:/projects/python_learn/twelve/c8.py", line 27, in <module>
    f3('test,','test2',a=1,b=2,c='123')
TypeError: wrapper() got an unexpected keyword argument 'a'

这样就报错的了。
解决办法:仿照在装饰器中定义的可变参数列表*args,再定义一个关键字参数:

import time

def decorator(func):
    def wrapper(*args,**kw):
        print(time.time())
        func(*args,**kw) 
    return wrapper

@decorator
def f1(func_name):
    print('Hello world!' + func_name)

@decorator
def f2(func_name1,func_name2):
    print(func_name1+func_name2)


@decorator
def f3(func_name1,func_name2,**kw): 
    print(func_name1+func_name2)
    print(kw)

f1('hello')
f2('he','llo')
f3('test,','test2',a=1,b=2,c='123')

-------------------------------------------------------
输出:
1535902344.7262278
Hello world!hello
1535902344.7262278
hello
1535902344.7262278
test,test2
{'a': 1, 'b': 2, 'c': '123'}

这样,f3中也打印了时间,也能使用定义的装饰器了。

这个装饰器才算通用性更强!

在装饰器中的一个写法(小技巧):func(*args,**kw),这样使用的话,不管调用的函数有多少个参数,还是有关键字参数,或者我们并不知道函数中的参数是什么样子的,都可以用*args**kw来调用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值