python怎样定义带参数的装饰器

  介绍

小编给大家分享一下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怎样定义带参数的装饰器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

python怎样定义带参数的装饰器