参数检查:1. 参数的个数;2. 参数的类型;3. 返回值的类型。

考虑如下的函数:

import htmldef 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)]

显然我们希望传递进来三个参数,分别为strintstr类型,可对返回值不做要求。

那么我们该如何实现对上述参数要求,进行参数检查呢?

import functoolsdef 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 wrapperreturn 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 进阶 —— 使用修饰器执行函数的参数检查相关推荐

  1. python 进阶:修饰器的介绍

    参考链接:Python 函数装饰器 我认为python中的装饰器是一个很厉害的功能,他能瞬间提升代码的逼格,但对于我这样的小白来说,别说为所欲为的使用了,就连简单的尝试一下,却也是难于登天.经过长达半 ...

  2. Python使用修饰器强制函数只接收关键参数

    前面发过一篇文章介绍了单独一个星号或斜线作为函数参数的含义,请查看:Python函数中单独一个星号或斜线作为形参的含义 如果需要强制函数的所有参数都必须以关键参数形式进行传值,可以在定义函数时把单独一 ...

  3. python修饰器执行步骤_Python修饰器学习总结

    1.大总结,修饰器就是把被修饰的函数作为一个参数传入修饰器函数.格式如下 @修饰器函数 def 函数 修饰器函数是要至少套一个函数的,即: def xxx def yyy ... return yyy ...

  4. python进阶20装饰器

    原创博客地址:python进阶20装饰器 Nested functions Python允许创建嵌套函数,这意味着我们可以在函数内声明函数并且所有的作用域和声明周期规则也同样适用. 1 2 3 4 5 ...

  5. Python之pandas:pandas.set_option函数的参数详细解释

    Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...

  6. python函数修饰器_Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

  7. python两个装饰器执行顺序_python中多个装饰器的执行顺序

    今天讲一下python中装饰器的执行顺序,以两个装饰器为例. 装饰器代码如下: def wrapper_out1(func): print('--out11--') def inner1(*args, ...

  8. Python进阶: Decorator 装饰器你太美

    函数 -> 装饰器 函数的4个核心概念 1.函数可以赋与变量 def func(message):print('Got a message: {}'.format(message))send_m ...

  9. python多个装饰器执行顺序_Python面试题之多个装饰器执行顺序

    疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子:def decorator_a(func): print 'Get in decorator_a' def i ...

最新文章

  1. 工大附中、铁一太牛了,2019年高分段人数令人震惊!
  2. Ognl标签常用例子 只能在Struts2中使用
  3. Struts2封装获取表单数据方式
  4. boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
  5. linux 脚本$字符,一文看懂shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义
  6. ISO8583报文协议(转)
  7. IceE-1.3.0的移植过程及错误Time.h:36: error: expected type-specifier before ‘time-转
  8. 芯故事 心感动:英特尔企业文化的力量
  9. JDBCAPI简介(二)
  10. android 中国市场份额 2015,2015年安卓芯片市场分析:不再一家独大
  11. [ThinkPHP]打开页面追踪调试
  12. 交友盲盒小程序/全开源版云开发交友盲盒小程序源码
  13. java遍历对象的属性_Java遍历对象所有属性
  14. matlab无限长一维原子链,优·王淑华固体物理答案第三章.ppt
  15. 华为物联网操作系统 LiteOS
  16. OBS Studio 录制视频画面很糊,不清晰,如何解决?
  17. 传说中的BNET边缘传输
  18. MySQL 生成累计乘积
  19. cocos2d-x 艺术字
  20. 1.单例模式之饿汉式

热门文章

  1. Spark解决的问题与体系结构
  2. python编程语言的优缺点_组队学习优秀作业 | Python的发展历史及其前景
  3. xsync 集群同步脚本介绍(拷贝文件不同的部分)
  4. spark-dataframe与rdd的区别
  5. 全局负载均衡通俗介绍_“集群和负载均衡”等的通俗解释
  6. 交换两个数不是三个数。
  7. clone远程代码 在不同电脑上git_Git 如何 clone 远程 非 master 分支的代码
  8. matlab函数集锦
  9. HiveQL学习笔记(五):Hive练习题
  10. 织梦手机站搜索结果显示为电脑站的搜索结果模板的解决方法