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使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python计算三角函数之asin()方法的使用
May 15 Python
Python字符串处理之count()方法的使用
May 18 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
浅谈关于Python3中venv虚拟环境
Aug 01 Python
python list格式数据excel导出方法
Oct 31 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
Python常见数字运算操作实例小结
Mar 22 Python
Python对象转换为json的方法步骤
Apr 25 Python
python系列 文件操作的代码
Oct 06 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 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开发者的10个技巧
2011/02/25 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
python仿抖音表白神器
2019/04/08 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
Python Celery多队列配置代码实例
2019/11/22 Python
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
大四学生思想汇报
2014/01/13 职场文书
旅游项目开发策划书
2014/01/18 职场文书
元旦晚会策划方案
2014/02/18 职场文书
公休请假条
2014/04/11 职场文书
一岗双责责任书
2014/04/15 职场文书
广告宣传策划方案
2014/05/21 职场文书
死亡赔偿协议书
2015/01/28 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
无犯罪记录证明样本
2015/06/16 职场文书