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中PIL安装简单教程
Apr 21 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
Python使用爬虫爬取静态网页图片的方法详解
Jun 05 Python
使用python将图片按标签分入不同文件夹的方法
Dec 08 Python
Python常用数据类型之间的转换总结
Sep 06 Python
django创建超级用户过程解析
Sep 18 Python
python画环形图的方法
Mar 25 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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/04/28 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
解决Vue项目中tff报错的问题
2020/10/21 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
video.js添加自定义组件的方法
2020/12/09 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
python实现图片批量剪切示例
2014/03/25 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
深入理解Python3 内置函数大全
2017/11/23 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
行政前台岗位职责
2013/12/04 职场文书
创业计划书六个要素
2013/12/26 职场文书
售后服务经理岗位职责范本
2014/02/22 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
千手观音观后感
2015/06/03 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL