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利用elaphe制作二维条形码实现代码
May 25 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
python3.5仿微软计算器程序
Mar 30 Python
Centos Python2 升级到Python3的简单实现
Jun 21 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
python购物车程序简单代码
Apr 18 Python
基于python历史天气采集的分析
Feb 14 Python
详解python之heapq模块及排序操作
Apr 04 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
学习python需要有编程基础吗
Jun 02 Python
python实现批处理文件
Jul 28 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
解读Django框架中的低层次缓存API
2015/07/24 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
python多进程间通信代码实例
2019/09/30 Python
python编写猜数字小游戏
2019/10/06 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
捷克时尚网上商店:OTTO
2018/03/15 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
大四自我鉴定
2014/02/08 职场文书
出纳员岗位责任制
2014/02/11 职场文书
教师教学评估方案
2014/05/09 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
后备干部推荐材料
2014/12/24 职场文书
教师辞职信范文
2015/02/28 职场文书
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python