python如何定义带参数的装饰器
作者:北门吹雪 时间:2022-01-07 04:18:30
本文实例为大家分享了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, age, height):
print(name, age, height)
if __name__ == '__main__':
func('bei_men', 18, 1.75)
来源:http://www.cnblogs.com/2bjiujiu/p/7291819.html
标签:python,参数,装饰器
0
投稿
猜你喜欢
简单的Python调度器Schedule详解
2021-09-15 09:49:19
javascript jQuery $.post $.ajax用法
2024-04-16 08:52:52
python中合并两个文本文件并按照姓名首字母排序的例子
2023-05-28 17:41:32
python 产生token及token验证的方法
2023-05-19 17:25:13
Python命名空间与作用域深入全面详解
2022-03-07 08:36:10
Python下载指定页面上图片的方法
2023-08-16 09:32:37
python好玩的项目—色情图片识别代码分享
2022-01-26 03:19:19
MySQL 8.0.29 安装配置方法图文教程(windows zip版)
2024-01-17 17:06:44
开心网让人很不开心
2009-04-05 15:56:00
SQL中函数 replace 的参数1的数据类型ntext无效的解决方法
2024-01-18 15:23:15
xWin的HTC分享
2009-09-13 18:50:00
Go语言中的UTF-8实现
2024-04-25 15:30:51
使用Python防止SQL注入攻击的实现示例
2022-02-09 05:28:24
查看ASP详细错误提示信息的图文设置方法
2011-02-05 11:02:00
详细讲解如何删除Access数据库中的空记录
2008-11-28 14:58:00
一个较复杂的字符串截取函数
2009-11-02 10:45:00
MySQL Community Server 8.0.29安装配置方法图文教程
2024-01-22 12:02:55
解析Python中while true的使用
2022-07-23 21:19:53
详解Python prometheus_client使用方式
2022-01-17 11:09:37
解决Pytorch训练过程中loss不下降的问题
2023-03-01 09:30:22