python如何定义带参数的装饰器

作者:北门吹雪 时间:2022-01-07 04:18:30 

本文实例为大家分享了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)

来源:http://www.cnblogs.com/2bjiujiu/p/7291819.html

标签:python,参数,装饰器
0
投稿

猜你喜欢

  • 简单的Python调度器Schedule详解

    2021-09-15 09:49:19
  • javascript jQuery $.post $.ajax用法

    2024-04-16 08:52:52
  • python中合并两个文本文件并按照姓名首字母排序的例子

    2023-05-28 17:41:32
  • python 产生token及token验证的方法

    2023-05-19 17:25:13
  • Python命名空间与作用域深入全面详解

    2022-03-07 08:36:10
  • Python下载指定页面上图片的方法

    2023-08-16 09:32:37
  • python好玩的项目—色情图片识别代码分享

    2022-01-26 03:19:19
  • MySQL 8.0.29 安装配置方法图文教程(windows zip版)

    2024-01-17 17:06:44
  • 开心网让人很不开心

    2009-04-05 15:56:00
  • SQL中函数 replace 的参数1的数据类型ntext无效的解决方法

    2024-01-18 15:23:15
  • xWin的HTC分享

    2009-09-13 18:50:00
  • Go语言中的UTF-8实现

    2024-04-25 15:30:51
  • 使用Python防止SQL注入攻击的实现示例

    2022-02-09 05:28:24
  • 查看ASP详细错误提示信息的图文设置方法

    2011-02-05 11:02:00
  • 详细讲解如何删除Access数据库中的空记录

    2008-11-28 14:58:00
  • 一个较复杂的字符串截取函数

    2009-11-02 10:45:00
  • MySQL Community Server 8.0.29安装配置方法图文教程

    2024-01-22 12:02:55
  • 解析Python中while true的使用

    2022-07-23 21:19:53
  • 详解Python prometheus_client使用方式

    2022-01-17 11:09:37
  • 解决Pytorch训练过程中loss不下降的问题

    2023-03-01 09:30:22
  • asp之家 网络编程 m.aspxhome.com