本文实例为大家分享了python定义带参数装饰器的具体代码,供大家参考,具体内容如下
案例:
实现一个装饰器,用它来检查被装饰函数的参数类型。
需求:
装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常
如何解决这个问题?
先要获取函数的签名,并且获得装饰器中参数,然后把函数签名和装饰器中参数对应绑定
把调用函数时候传入的参数和函数签名进行绑定
把实参和装饰器中定义的数据进行类型比较,不匹配抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#!/usr/bin/python3 from inspect import signature def check_type( * ty_args, * * ty_kwargs): def out_wrapper(func): # 通过signature方法,获取函数形参:name, age, height sig = signature(func) # 获得装饰器传来的参数, 函数签名与之绑定,字典类型 bind_types = sig.bind_partial( * ty_args, * * ty_kwargs).arguments print (bind_types) def wrapper( * args, * * kwargs): # 给执行函数中具体的实参进行和形参进行绑定,形成字典的形式 func_type = sig.bind( * args, * * kwargs).arguments.items() print (func_type) # 循环形参和实参字典的items()形式 for name, obj in func_type: if name in bind_types: if not isinstance (obj, bind_types[name]): raise TypeError( '%s must be %s' % (name, bind_types[name])) func( * args, * * kwargs) return wrapper return out_wrapper # 通过装饰器实现对函数参数进行类型检查 @check_type ( str , int , float ) def func(name, age, height): print (name, age, height) if __name__ = = '__main__' : func( 'bei_men' , 18 , 1.75 ) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/2bjiujiu/p/7291819.html