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 18 Python
在Python的循环体中使用else语句的方法
Mar 30 Python
Python类的用法实例浅析
May 27 Python
python中常用的九种预处理方法分享
Sep 11 Python
Django model序列化为json的方法示例
Oct 16 Python
Python 忽略warning的输出方法
Oct 18 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
Python any()函数的使用方法
Oct 28 Python
pytorch数据预处理错误的解决
Feb 20 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 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
javascript比较文档位置
2008/04/08 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
vue axios整合使用全攻略
2018/05/24 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
女方回门宴答谢词
2014/01/14 职场文书
银行类自荐信
2014/02/04 职场文书
教师工作失职检讨书
2014/09/18 职场文书
学习焦裕禄观后感
2015/06/09 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
Django中的JWT身份验证的实现
2021/05/07 Python