本文实例为大家分享了python定义带参数装饰器的具体代码,供大家参考,具体内容如下
案例:
需求:
装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常
如何解决这个问题?
先要获取函数的签名,并且获得装饰器中参数,然后把函数签名和装饰器中参数对应绑定
把调用函数时候传入的参数和函数签名进行绑定
把实参和装饰器中定义的数据进行类型比较,不匹配抛出异常
#!/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,height): print(name,height) if __name__ == '__main__': func('bei_men',18,1.75)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。