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之永远强大的函数
Sep 14 Python
Python的迭代器和生成器
Jul 29 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
详解python里使用正则表达式的全匹配功能
Oct 19 Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 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中如何定义和使用常量
2013/02/28 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP的PDO连接讲解
2019/01/24 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
JQuery伸缩导航练习示例
2013/11/13 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
python连接mysql实例分享
2016/10/09 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
用pandas中的DataFrame时选取行或列的方法
2018/07/11 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
python自动生成sql语句的脚本
2021/02/24 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
幼儿园五一活动方案
2014/02/07 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
《金子》教学反思
2014/04/13 职场文书
工会换届选举方案
2014/05/21 职场文书
总经理任命书范本
2014/06/05 职场文书
房屋出售授权委托书
2014/10/12 职场文书
工作年限证明模板
2014/11/01 职场文书
Python基础之pandas数据合并
2021/04/27 Python
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript