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异常处理总结
Aug 15 Python
python对数组进行反转的方法
May 20 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
Python数据可视化之画图
Jan 15 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
Python如何用re模块实现简易tokenizer
May 02 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 minixml详解
2008/07/19 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
Python max内置函数详细介绍
2016/11/17 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python模块WSGI使用详解
2018/02/02 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
自行车广告词大全
2014/03/21 职场文书
企业职业病防治方案
2014/05/29 职场文书
工地标语大全
2014/06/18 职场文书
门店店长岗位职责
2015/04/14 职场文书
检讨书怎么写
2015/05/07 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
股权投资协议书
2016/03/23 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书