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异步任务队列示例
Apr 01 Python
Python出现segfault错误解决方法
Apr 16 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
Jun 28 Python
Python实现最常见加密方式详解
Jul 13 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
python 常见的排序算法实现汇总
Aug 21 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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 MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
2017/03/01 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Python命名空间详解
2014/08/18 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
Python退火算法在高次方程的应用
2018/07/26 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
Python中如何导入类示例详解
2019/04/17 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
信息科学与技术专业求职信范文
2014/02/20 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
高三励志标语
2014/06/05 职场文书
2014年民警工作总结
2014/11/25 职场文书
遗嘱范文
2015/08/07 职场文书
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
vue+iview实现手机号分段输入框
2022/03/25 Vue.js