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实现Const详解
Jan 27 Python
Python检测生僻字的实现方法
Oct 23 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
Python全排列操作实例分析
Jul 24 Python
pytorch permute维度转换方法
Dec 14 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 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 检查扩展库或函数是否可用的代码
2010/04/06 PHP
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python缩进区别分析
2014/02/15 Python
python正则表达式re模块详解
2014/06/25 Python
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
解析Python中while true的使用
2015/10/13 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
python写一个随机点名软件的实例
2019/11/28 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
如何用Lucene索引数据库
2016/02/23 面试题
C语言变量的命名规则都有哪些
2013/12/27 面试题
旷课检讨书1000字
2014/02/14 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
客房服务员岗位职责
2015/02/09 职场文书
详解Python描述符的工作原理
2021/06/11 Python