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 相关文章推荐
使用setup.py安装python包和卸载python包的方法
Nov 27 Python
python中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
Python自动连接ssh的方法
Mar 07 Python
python递归全排列实现方法
Aug 18 Python
python print出共轭复数的方法详解
Jun 25 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
Django中的用户身份验证示例详解
Aug 07 Python
Django之模板层的实现代码
Sep 09 Python
Python3并发写文件与Python对比
Nov 20 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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
一个分页的论坛
2006/10/09 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
js操作textarea 常用方法总结
2012/12/03 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
Python学生信息管理系统修改版
2018/03/13 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Python修改列表值问题解决方案
2020/03/06 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
劳资协议书范本
2014/04/23 职场文书
2014年计生标语
2014/06/23 职场文书
2014年预算员工作总结
2014/12/05 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
人生遥控器观后感
2015/06/11 职场文书
培训后的感想
2015/08/07 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书