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 利用装饰器检测函数参数

学习python时看到有关装饰器的相关知识
  • dk_zhe
  • dk_zhe
  • 2014年09月26日 17:25
  • 2029

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

python获取脚本传递参数: import sys print sys.argv[0] ##脚本名 print sys.argv[1] ## 第一个参数print sys.argv ###参数...
  • ysdaniel
  • ysdaniel
  • 2012年09月27日 19:12
  • 37924

Python装饰器:简单装饰,带参数装饰与类装饰器

Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。 第一步:最简单的函数,准备附加额外功能 # -*- coding:g...

python 函数参数(必选参数、默认参数、可选参数、关键字参数)

参考: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013747384493...

python中的修饰器@

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

Python 正则表达式的 Match 对象的 group 方法

用法介绍match.group([group1, ...])返回 match 的一个或多个子组。如果只有唯的一参数,返回单一的子符串;如果有多个参数,结果是对应每一个参数的元素组成的 tuple 。 ...
  • icbm
  • icbm
  • 2017年07月03日 17:05
  • 802

【恶补】之python一天速成

python一天速成都是骗纸~怎么可能一天~只是快速了解一些基本的 首先我是个python新手,只在网上搜例子然后用python写过一些分析文件的脚本,现在工作需要,要短时间进一步了解pyth...

Python进阶04 函数的参数对应

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   我们已经接触过函数(function)的参数(arguments)...

<Python进阶读书笔记>之(一) 函数不定参数传递

之(一) 函数不定参数传递

Python进阶04 函数的参数对应

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   我们已经接触过函数(function)的参数(arguments)传递。当...
  • seevc
  • seevc
  • 2015年02月03日 11:30
  • 211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python 进阶 —— 使用修饰器执行函数的参数检查
举报原因:
原因补充:

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