python如何定义带参数的装饰器


Posted in Python onMarch 20, 2018

本文实例为大家分享了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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中PIL安装简单教程
Apr 21 Python
python文本数据相似度的度量
Mar 12 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
python多进程实现文件下载传输功能
Jul 28 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
django框架使用方法详解
Jul 18 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
python实现将range()函数生成的数字存储在一个列表中
Apr 02 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
基于python实现上传文件到OSS代码实例
May 09 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 02 Python
Python回文字符串及回文数字判定功能示例
Mar 20 #Python
python如何把嵌套列表转变成普通列表
Mar 20 #Python
Python内置函数reversed()用法分析
Mar 20 #Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 #Python
python如何拆分含有多种分隔符的字符串
Mar 20 #Python
Python中str.join()简单用法示例
Mar 20 #Python
单利模式及python实现方式详解
Mar 20 #Python
You might like
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
python3实现高效的端口扫描
2019/08/31 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
合作协议书模板2014
2014/09/26 职场文书
2015年党小组工作总结
2015/05/26 职场文书
教学副校长工作总结
2015/08/13 职场文书
python实现自定义日志的具体方法
2021/05/28 Python
深入解析MySQL索引数据结构
2021/10/16 MySQL
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers