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中pycurl库的用法实例
Sep 30 Python
浅谈Python程序与C++程序的联合使用
Apr 07 Python
简单解决Python文件中文编码问题
Nov 22 Python
python3音乐播放器简单实现代码
Apr 20 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
Python整数对象实现原理详解
Jul 01 Python
python 进程的几种创建方式详解
Aug 29 Python
Python API len函数操作过程解析
Mar 05 Python
Django 再谈一谈json序列化
Mar 16 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 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
mysq GBKl乱码
2006/11/28 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
php缓冲输出实例分析
2015/01/05 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
jQuery 使用个人心得
2009/02/26 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
javascript的BOM
2016/05/03 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
OpenCV实现人脸识别
2017/04/07 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
公司部门司机岗位职责
2014/01/03 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
顶碗少年教学反思
2014/02/21 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
好学生评语大全
2014/05/05 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书