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正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
在Python中使用dict和set方法的教程
Apr 27 Python
Django 导出 Excel 代码的实例详解
Aug 11 Python
python pycurl验证basic和digest认证的方法
May 02 Python
Python3实现对列表按元组指定列进行排序的方法分析
Dec 22 Python
python3中的eval和exec的区别与联系
Oct 10 Python
解决pytorch-yolov3 train 报错的问题
Feb 18 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
基于Python爬取素材网站音频文件
Oct 21 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
javascript闭包的理解
2015/04/01 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
python和js交互调用的方法
2020/06/23 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
活动邀请函范文
2014/01/19 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
先进工作者事迹材料
2014/12/23 职场文书
行政上诉状范文
2015/05/23 职场文书
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers