python如何定义带参数的装饰器
作者:北门吹雪 发布时间:2022-01-07 04:18:30
标签:python,参数,装饰器
本文实例为大家分享了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
0
投稿
猜你喜欢
- pycharm对数据库的查询等操作(非多步操作)import pymysqlimport pandas as pdconnect = pym
- pandas.DataFrame为每一列保存一个数据类型dtype。要仅提取(选择)特定数据类型为dtype的列,请使用pandas.Dat
- torchvision.datasetsDatasets 拥有以下API:__getitem____len__Datasets都是 torc
- 根据一个爬取豆瓣电影排名的小应用,来简单使用etree和request库。etree使用xpath语法。import requestsimp
- 今天很有可能你已经做了一些使用滑动窗口(也称为移动窗口)的事情,而你甚至不知道它。例如:许多编辑算法都是基于移动窗口的。在GIS中做地形分析
- <body oncontextmenu = "return false"> <body onconte
- 最近在写的一个django小项目需要实现用户上传图片的功能,使用到了七牛云存储,特此记录下来。这里我使用的七牛python SDK 版本是7
- blankzheng的blog:http://www.planabc.net/1、使用fieldset和legend标签在form中,我们经
- 本文实例讲述了javascript将数字转换整数金额大写的方法。分享给大家供大家参考。具体实现方法如下:function digit_upp
- vue动态添加表单validateField验证,代码如下所示:<template> <el-f
- 全局,动态,默认值-1表示自动调整大小,公式:8 + (max_connections / 100)。最小值0,最大值16384,查看当前:
- 可以使用Python的email模块来实现带有附件的邮件的发送。SMTP (Simple Mail Transfer Protocol)邮件
- 最近火热全文的ChatGPT,被很多人玩出了花,我们在Github上可以看到几个常见的逆向SDK包,这一篇我将以学习的方式来写这一篇文章。这
- 在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧。JS中,this的值取决
- 看书笔记db file scattered read DB ,db file sequential read DB,free buffer
- 简介Pycharm安装以后必须激活后,才能正常的使用。否则就不能使用。激活PyCharm1、Activation code激活优点:Wind
- 前言对于使用Vue的前端而言,watch、computed和methods三个属性相信是不陌生的,是日常开发中经常使用的属性。但是对于它们的
- 一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来
- Master Master数据库保存有放在SQLSERVER实体上的所有数据库,它还是将引擎固定起来的粘合剂。由于如果不使用主数据库,SQL
- 本文实例讲述了Python3实现对列表按元组指定列进行排序的方法。分享给大家供大家参考,具体如下:Python版本: python3.+ 运