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实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
举例讲解Python中装饰器的用法
Apr 27 Python
Django之模型层多表操作的实现
Jan 08 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
pycharm快捷键汇总
Feb 14 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
Python实现中英文全文搜索的示例
Dec 04 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
django学习之ajax post传参的2种格式实例
May 14 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下使用SMTP发邮件的代码
2008/01/10 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
vue与django集成打包的实现方法
2019/11/11 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python将文本转换成图片输出的方法
2015/04/28 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python 求10个数的平均数实例
2019/12/16 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
运动会获奖感言
2014/02/11 职场文书
公司股份转让协议书范本
2015/01/28 职场文书