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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。