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中实现常量(Const)功能
Jan 28 Python
深入解析Python中的WSGI接口
May 11 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
python 批量解压压缩文件的实例代码
Jun 27 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
Django 5种类型Session使用方法解析
Apr 29 Python
使用pytorch 筛选出一定范围的值
Jun 28 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
python 对图片进行简单的处理
Jun 23 Python
Python Pandas模块实现数据的统计分析的方法
Jun 24 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
JS简单实现登陆验证附效果图
2013/11/19 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
图解js图片轮播效果
2015/12/20 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
python远程登录代码
2008/04/29 Python
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
python装饰器深入学习
2018/04/06 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
Python使用folium excel绘制point
2019/01/03 Python
django迁移数据库错误问题解决
2019/07/29 Python
如何基于Python按行合并两个txt
2020/11/03 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
清洁工岗位职责
2014/01/29 职场文书
护士进修自我鉴定
2014/02/07 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js
python区块链实现简版工作量证明
2022/05/25 Python