python如何定义带参数的装饰器
本文实例为大家分享了python定义带参数装饰器的具体代码,供大家参考,具体内容如下
案例:
实现一个装饰器,用它来检查被装饰函数的参数类型。
需求:
装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常
如何解决这个问题?
先要获取函数的签名,并且获得装饰器中参数,然后把函数签名和装饰器中参数对应绑定
把调用函数时候传入的参数和函数签名进行绑定
把实参和装饰器中定义的数据进行类型比较,不匹配抛出异常
#!/usr/bin/python3
frominspectimportsignature
defcheck_type(*ty_args,**ty_kwargs):
defout_wrapper(func):
#通过signature方法,获取函数形参:name,age,height
sig=signature(func)
#获得装饰器传来的参数,函数签名与之绑定,字典类型
bind_types=sig.bind_partial(*ty_args,**ty_kwargs).arguments
print(bind_types)
defwrapper(*args,**kwargs):
#给执行函数中具体的实参进行和形参进行绑定,形成字典的形式
func_type=sig.bind(*args,**kwargs).arguments.items()
print(func_type)
#循环形参和实参字典的items()形式
forname,objinfunc_type:
ifnameinbind_types:
ifnotisinstance(obj,bind_types[name]):
raiseTypeError('%smustbe%s'%(name,bind_types[name]))
func(*args,**kwargs)
returnwrapper
returnout_wrapper
#通过装饰器实现对函数参数进行类型检查
@check_type(str,int,float)
deffunc(name,age,height):
print(name,age,height)
if__name__=='__main__':
func('bei_men',18,1.75)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。