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 15 Python
urllib2自定义opener详解
Feb 07 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
Python中几种导入模块的方式总结
Apr 27 Python
python爬虫之百度API调用方法
Jun 11 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
python实现随机加减法生成器
Feb 24 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
Python 使用dict实现switch的操作
Apr 07 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
老生常谈Python进阶之装饰器
2017/05/11 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
python找出因数与质因数的方法
2019/07/25 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
django数据模型on_delete, db_constraint的使用详解
2019/12/24 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
学生干部的自我评价分享
2014/01/18 职场文书
公益广告标语
2014/06/19 职场文书
微笑服务标语
2014/06/24 职场文书
世界读书日的活动方案
2014/08/20 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
初婚初育证明范本
2015/06/18 职场文书
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server