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编程开发之日期操作实例分析
Nov 13 Python
Zabbix实现微信报警功能
Oct 09 Python
python记录程序运行时间的三种方法
Jul 14 Python
python3实现跳一跳点击跳跃
Jan 08 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
详解python中各种文件打开模式
Jan 19 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
python os.rename实例用法详解
Dec 06 Python
python-地图可视化组件folium的操作
Dec 14 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 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
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
浅谈Python数据类型之间的转换
2016/06/08 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
python中rc1什么意思
2020/06/19 Python
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
无工作经验者个人求职信范文
2013/12/22 职场文书
秋天的雨教学反思
2014/04/27 职场文书
好人好事演讲稿
2014/09/01 职场文书
协议书范文
2015/01/27 职场文书
观后感格式
2015/06/19 职场文书
师范生见习总结范文
2015/06/23 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS