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 open读写文件实现脚本
Sep 06 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
Python和Go语言的区别总结
Feb 20 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
Django自定义列表 models字段显示方式
Apr 03 Python
Django静态文件加载失败解决方案
Aug 26 Python
用python实现一个简单的验证码
Dec 09 Python
opencv实现图像几何变换
Mar 24 Python
python基础之类属性和实例属性
Oct 24 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
桌面中心(一)创建数据库
2006/10/09 PHP
php 远程关机操作的代码
2008/12/05 PHP
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
Python实现Dijkstra算法
2018/10/17 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
python3中确保枚举值代码分析
2020/12/02 Python
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
中餐厅主管的职责范文
2014/02/04 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
python中的sys模块和os模块
2022/03/20 Python
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS