Python使用修饰器执行函数的参数检查功能示例


Posted in Python onSeptember 26, 2017

本文实例讲述了Python使用修饰器执行函数的参数检查功能。分享给大家供大家参考,具体如下:

参数检查:1. 参数的个数;2. 参数的类型;3. 返回值的类型。

考虑如下的函数:

import html
def make_tagged(text, tag):
  return '<{0}>{1}</{0}>'.format(tag, html.escape(text))

显然我们希望传递进来两个参数,且参数类型/返回值类型均为str,再考虑如下的函数:

def repeat(what, count, separator) :
  return ((what + separator)*count)[:-len(separator)]

显然我们希望传递进来三个参数,分别为str,int,str类型,可对返回值不做要求。

那么我们该如何实现对上述参数要求,进行参数检查呢?

import functools
def statically_typed(*types, return_type=None):
  def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
      if len(args) > len(types):
        raise ValueError('too many arguments')
      elif len(args) < len(types):
        raise ValueError('too few arguments')
      for i, (type_, arg) in enumerate(zip(types, args)):
        if not isinstance(type_, arg):
          raise ValueError('argument {} must be of type {}'.format(i, type_.__name__))
      result = func(*args, **kwargs)
      if return_type is not None and not isinstance(result, return_type):
        raise ValueError('return value must be of type {}'.format(return_type.__name__))
      return wrapper
    return decorator

这样,我们便可以使用修饰器模板执行参数检查了:

@statically_typed(str, str, return_type=str)
def make_tagged(text, tag):
  return '<{0}>{1}</{0}>'.format(tag, html.escape(text))
@statically_typed(str, int, str)
def repeat(what, count, separator):
  return ((what + separator)*count)[:-len(separator)]

注:从静态类型语言(C/C++、Java)转入 Python 的开发者可能比较喜欢用修饰器对函数的参数及返回值执行静态类型检查,但这样做会增加 Python 程序在运行期的开销,而编译型语言则没有这种运行期开销(Python 是解释型语言)。

更多关于Python相关内容可查看本站专题:《Python函数使用技巧总结》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跨平台python异步回调机制实现和使用方法
Nov 26 Python
Python时间戳与时间字符串互相转换实例代码
Nov 28 Python
Python编程中运用闭包时所需要注意的一些地方
May 02 Python
Python日志模块logging基本用法分析
Aug 23 Python
python里dict变成list实例方法
Jun 26 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
python requests包的request()函数中的参数-params和data的区别介绍
May 05 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
Python实现京东抢秒杀功能
Jan 25 Python
python中的random模块和相关函数详解
Apr 22 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 #Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 #Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 #Python
python九九乘法表的实例
Sep 26 #Python
Python实现简单的HttpServer服务器示例
Sep 25 #Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 #Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 #Python
You might like
PHP递归统计系统中代码行数
2019/09/19 PHP
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
javascript常用函数(1)
2015/11/04 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
Python 解析XML文件
2009/04/15 Python
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python 序列的方法总结
2016/10/18 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
python实现扫描日志关键字的示例
2018/04/28 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
小学生综合素质评语
2014/04/23 职场文书
留守儿童工作方案
2014/06/02 职场文书
高中综合实践活动总结
2014/07/07 职场文书
庆祝教师节标语
2014/10/09 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
党员转正意见怎么写
2015/06/03 职场文书
公司人事管理制度
2015/08/05 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
一文搞懂python异常处理、模块与包
2021/06/26 Python
JavaScript实现优先级队列
2021/12/06 Javascript
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android