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 Sql数据库增删改查操作简单封装
Apr 18 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
python3+PyQt5实现柱状图
Apr 24 Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 Python
Python闭包和装饰器用法实例详解
May 22 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
python redis连接 有序集合去重的代码
Aug 04 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
解决python 上传图片限制格式问题
Oct 30 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
python实现简单文件读写函数
Feb 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
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
javascript some()函数用法详解
2014/11/13 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
python实现图片九宫格分割
2021/03/07 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
11月红领巾广播稿
2014/01/17 职场文书
毕业生自荐信格式
2014/03/07 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书