介绍
小编给大家分享一下python怎样定义带参数的装饰器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强>案例:强>
,,,,,,实现一个装饰器,用它来检查被装饰函数的参数类型。
,,,,,,<强>需求:强>
装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常
<>强如何解决这个问题? 强>
先要获取函数的签的名,并且获得装饰器中参数,然后把函数签名和装饰器中参数对应绑定
把调用函数时候传入的参数和函数签名进行绑定
把实参和装饰器中定义的数据进行类型比较,不匹配抛出异常
# !/usr/bin/python3 , 得到inspect import 签名 , , def check_type (* ty_args,, * * ty_kwargs): ,, def 才能out_wrapper(函数): ,,,#,通过签名方法,获取函数形参:姓名,年龄,身高 ,,,sig =,签名(函数) ,,,#,获得装饰器传来的参数,,函数签名与之绑定,字典类型 ,,,bind_types =, sig.bind_partial (* ty_args,, * * ty_kwargs) .arguments ,,,印刷(bind_types) ,,,, ,,,def 包装器(* args,, * * kwargs): ,,,,,#,给执行函数中具体的实参进行和形参进行绑定,形成字典的形式 ,,,,,func_type =, sig.bind (* args,, * * kwargs) .arguments.items () ,,,,,印刷(func_type) ,,,,,#,循环形参和实参字典的项目()形式 ,,,,,for 名字,,obj 拷贝func_type: ,,,,,,,if name 拷贝bind_types: ,,,,,,,,,if not isinstance (obj, bind_types[名字]): ,,,,,,,,,,,raise TypeError (& # 39; % s must  be % & # 39;, %,(名字,,bind_types[名字])) ,,,,,func (* args,, * * kwargs) ,,,return 包装 return out_wrapper才能 , , #,通过装饰器实现对函数参数进行类型检查 @check_type (str, int,浮动) def func(姓名,年龄,身高): 打印才能(姓名,年龄,身高) , , if __name__ ==, & # 39; __main__ # 39;: func才能(& # 39;bei_men& # 39;,, 18日,1.75)
以上是“python怎样定义带参数的装饰器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!