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实现的系统实用log类实例
Jun 30 Python
Python数据类型详解(四)字典:dict
May 12 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
python3.x上post发送json数据
Mar 04 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
通过python爬虫赚钱的方法
Jan 29 Python
python如何实现从视频中提取每秒图片
Oct 22 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
pycharm sciview的图片另存为操作
Jun 01 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 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
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
python远程连接MySQL数据库
2019/04/19 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
英语简历自我评价
2014/01/26 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
环境卫生倡议书
2014/08/29 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang