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实现对一个完整url进行分割的方法
Apr 29 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
python3下pygame如何实现显示中文
Jan 11 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
Python如何在bool函数中取值
Sep 21 Python
Python获取指定网段正在使用的IP
Dec 14 Python
requests在python中发送请求的实例讲解
Feb 17 Python
Python Spyder 调出缩进对齐线的操作
Feb 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
php HTML无刷新提交表单
2016/04/05 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
DHTML Slide Show script图片轮换
2008/03/03 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
详解Python的单元测试
2015/04/28 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Ubuntu下Anaconda和Pycharm配置方法详解
2019/06/14 Python
Django中create和save方法的不同
2019/08/13 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
最热门的自我评价
2013/12/30 职场文书
小学语文课后反思精选
2014/04/25 职场文书
学校教学工作总结2015
2015/05/19 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL