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 相关文章推荐
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
Python中操作符重载用法分析
Apr 29 Python
Ruby元编程基础学习笔记整理
Jul 02 Python
Python生成密码库功能示例
May 23 Python
详解用python实现简单的遗传算法
Jan 02 Python
Python实现二维数组输出为图片
Apr 03 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
Python实现网站表单提交和模板
Jan 15 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
pytorch索引查找 index_select的例子
Aug 18 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 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中实现crontab代码分享
2015/03/26 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
python 消费 kafka 数据教程
2019/12/21 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
应聘自荐书
2013/10/08 职场文书
课程设计心得体会
2013/12/28 职场文书
期末自我鉴定
2014/01/23 职场文书
报社实习生自荐信
2014/01/24 职场文书
银行员工考核评语
2014/12/31 职场文书
土地租赁协议书
2015/01/29 职场文书
春节晚会开场白
2015/05/29 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL
mysql sql常用语句大全
2022/06/21 MySQL