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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python获取服务器信息的最简单实现方法
Mar 05 Python
Python如何读取MySQL数据库表数据
Mar 11 Python
Python中的单行、多行、中文注释方法
Jul 19 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
Python 元组操作总结
Sep 18 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
Python 多线程之threading 模块的使用
Apr 14 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 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实现的四则运算表达式计算实现代码
2011/08/02 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
Django框架models使用group by详解
2020/03/11 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
Django日志及中间件模块应用案例
2020/09/10 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
护理专业毕业生推荐信
2013/10/31 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫