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中的多线程实例教程
Aug 27 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
Python中return self的用法详解
Jul 27 Python
Python使用线程来接收串口数据的示例
Jul 02 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
python playwright之元素定位示例详解
Jul 23 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介绍篇
2010/10/26 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
jquery中文乱码的多种解决方法
2013/06/21 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
Three.js快速入门教程
2016/09/09 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
一篇不错的Python入门教程
2007/02/08 Python
Python字符转换
2008/09/06 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python变量的存储原理详解
2019/07/10 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
python小项目之五子棋游戏
2019/12/26 Python
利用python 下载bilibili视频
2020/11/13 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
2014植树节活动总结
2014/03/11 职场文书
三方合作协议书范本
2014/04/18 职场文书
师范类求职信
2014/06/21 职场文书
解放思想演讲稿
2014/09/11 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers