Python 进阶 —— 使用修饰器执行函数的参数检查

原创 2016年06月02日 11:46:31

参数检查: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)]

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

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

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中的修饰器@

'@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。 也就是说 @A def f(): 是非法的。 只可以在模块或类定义层内对函数进行...

python 获取脚本传递参数 及参数个数 检查文件 变量 是否存在 退出脚本

python获取脚本传递参数: import sys print sys.argv[0] ##脚本名 print sys.argv[1] ## 第一个参数print sys.argv ###参数...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Python 利用装饰器检测函数参数

学习python时看到有关装饰器的相关知识
  • dk_zhe
  • dk_zhe
  • 2014-09-26 17:25
  • 1838

Python参数类型检查的简单方法

Python是一门弱类型语言,很多从C/C++转过来的朋友起初不是很适应。比如,在声明一个函数时,不能指定参数的类型。用C做类比,那就是所有参数都是void*类型!void类型强制转换在C++中被广泛...
  • ani_di
  • ani_di
  • 2011-07-18 13:29
  • 5580

python函数修饰器

原文:Function Decorators aortiz | 31 January, 2009 09:50 The Python programming language has an inte...

Python进阶-- 函数的参数对应

回忆一下位置传递: def f(a,b,c): return a+b+c print(f(1,2,3)) 在调用f时,1,2,3根据位置分别传递给了a,b,c。   关键字传...

用const修饰函数的参数

用const修饰函数的参数 如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能。 const只能修饰输入参数: u...

Python中的修饰函数

首先,什么是函数修饰符?函数修饰符就是对原有函数做一层包装。比如有以下两个函数: 复制代码 def func1(): print 'I am function func1' def...
  • qtlyx
  • qtlyx
  • 2015-12-22 15:21
  • 210

Python进阶-函数默认参数

本文讲述了Python的默认参数,以及默认参数初始化,可变默认参数和不可变默认参数等高级特性

Python修饰器的函数式编程

Python的修饰器
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)