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中使用ElementTree解析XML示例
Jun 02 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
基于Python对数据shape的常见操作详解
Dec 25 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
使用python切片实现二维数组复制示例
Nov 26 Python
python输出数学符号实例
May 11 Python
Python pip使用超时问题解决方案
Aug 03 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
Python实现仓库管理系统
May 30 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超级全局变量数组小结
2012/10/04 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
vue ssr 指南详读
2018/06/29 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
ionic3双击返回退出应用的方法
2019/09/17 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
python操作toml文件的示例代码
2020/11/27 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
见习期自我鉴定
2013/11/07 职场文书
红旗方阵解说词
2014/02/12 职场文书
校园文明倡议书
2014/05/16 职场文书
高中生毕业评语
2014/12/30 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
Java实现简易的分词器功能
2021/06/15 Java/Android