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计算回文数的方法
Mar 11 Python
基于Python实现文件大小输出
Jan 11 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 Python
python+pyqt实现右下角弹出框
Oct 26 Python
python实现媒体播放器功能
Feb 11 Python
对numpy中数组元素的统一赋值实例
Apr 04 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
使用numba对Python运算加速的方法
Oct 15 Python
Python变量及数据类型用法原理汇总
Aug 06 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
教你怎么用python爬取爱奇艺热门电影
May 20 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图片等比例缩放
2015/07/28 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
newxtree.js代码
2007/03/13 Javascript
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
python如何实现内容写在图片上
2018/03/23 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
基于python实现学生管理系统
2018/10/17 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
机械设计制造专业个人求职信
2013/09/25 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
写给老师的保证书
2015/05/09 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS