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获取网页状态码示例
Mar 30 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
python自定义异常实例详解
Jul 11 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
Python编程实现二分法和牛顿迭代法求平方根代码
Dec 04 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
和孩子一起学习python之变量命名规则
May 27 Python
老生常谈python中的重载
Nov 11 Python
python 用for循环实现1~n求和的实例
Feb 01 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 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中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python中元类用法实例
2014/10/10 Python
Python实现简单拆分PDF文件的方法
2015/07/30 Python
Django与JS交互的示例代码
2017/08/23 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
python实现Virginia无密钥解密
2019/03/20 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
Shell如何接收变量输入
2012/09/24 面试题
总经理助理的八要求
2013/11/12 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
Go语言编译原理之源码调试
2022/08/05 Golang