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中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
Python定时器实例代码
Nov 01 Python
对python sklearn one-hot编码详解
Jul 10 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
centos6.8安装python3.7无法import _ssl的解决方法
Sep 17 Python
python中的print()输出
Apr 12 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
python对常见数据类型的遍历解析
Aug 27 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
使用scrapy实现增量式爬取方式
Jun 21 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结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
粗略分析Python中的内存泄漏
2015/04/23 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
Django REST framework 分页的实现代码
2019/06/19 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
后勤园长自我鉴定
2013/10/17 职场文书
应届生学校辅导员求职信
2013/11/07 职场文书
初中音乐教学反思
2014/01/12 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
电脑售后服务承诺书
2014/03/27 职场文书
2014年转正工作总结
2014/11/08 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python