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 26 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 Python
python删除过期文件的方法
May 29 Python
python修改字典内key对应值的方法
Jul 11 Python
Python简单计算文件夹大小的方法
Jul 14 Python
50行Python代码实现人脸检测功能
Jan 23 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
Python字符串三种格式化输出
Sep 17 Python
matplotlib对象拾取事件处理的实现
Jan 14 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 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
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
php实现的验证码文件类实例
2015/06/18 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
微信小程序签到功能
2018/10/31 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
python遍历数组的方法小结
2015/04/30 Python
Python中DJANGO简单测试实例
2015/05/11 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
python实现复制大量文件功能
2019/08/31 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Python定义一个函数的方法
2020/06/15 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
关于逃课的检讨书
2014/01/23 职场文书
新任教师自我鉴定
2014/02/24 职场文书
护士个人自我鉴定
2014/03/24 职场文书
网络技术专业求职信
2014/05/02 职场文书
党性教育心得体会
2014/09/03 职场文书
员工手册编写范本
2015/05/14 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
升学宴学生致辞
2015/09/29 职场文书
远程教育培训心得体会
2016/01/09 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
用Python远程登陆服务器的步骤
2021/04/16 Python