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
  • 2177

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

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

21行python代码实现拼写检查器

引入大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling。 下面是用21行python代码实现的一个简易但是具备...
  • Pwiling
  • Pwiling
  • 2016年01月24日 14:11
  • 9629

python参数传递那些事

一、前言 在python中,函数参数的定义和传递有以下几种方式: 语法 意义 def func(name) 普通参数,可以根据位置匹配,也可以...
  • acaiwlj
  • acaiwlj
  • 2015年11月23日 08:52
  • 2760

Python函数修饰器---当方法前遇到@参数化的修饰器方法时发生的事

一、前提概念   Python中的函数是对象。也因此,函数可以被当做变量使用。 二、代码模型 以下代码片段来自于: http://www.sharejs.com/codes/python/8361 #...
  • qq_39469761
  • qq_39469761
  • 2017年07月11日 09:25
  • 111

Python函数入参解惑

Python函数入参解惑介绍由于最近一个需求需要使用python来开发,所以就学习了下python,其中让我有一点困惑的是python的函数入参我第一眼确实蒙圈了,看内建函数定义了那么多入参,但是调用...
  • nicewuranran
  • nicewuranran
  • 2016年07月28日 21:50
  • 2109

Effective Java 读书笔记——38:检查参数的有效性

一般在方法执行之前先检查参数的有效性,如果参数值无效,那么很快它就会失败,并且清楚的抛出合适的异常。 如果这个方法没有检查参数的异常,那么可能在方法处理中出现令人费解的异常。更糟糕的有可能是,方法可以...
  • a921122
  • a921122
  • 2017年01月31日 05:41
  • 193

vim的python代码检测工具

这里介绍三个vim的插件, 一个是pyflakes,另外一个是pep8,还有它们的合体flake8安装安装很简单,找到你的.vim目录,把这两个压缩包解压了放进去 去下面vim官方下下来. pyf...
  • rainysia
  • rainysia
  • 2015年07月06日 14:38
  • 4612

2015062705 - EffactiveJava笔记 - 第38条 检查参数的有效性

第七章 方法     主要涉及方法的以下方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档.适合普通方法和构造方法.    焦点集中在可用性,健壮性和灵活性上.      第38...
  • zhtzyh2012
  • zhtzyh2012
  • 2015年06月27日 18:48
  • 448

Spring mvc自定义参数检查

转自:http://www.cnblogs.com/daxin/p/3296493.html 自定义Spring MVC3的参数映射和返回值映射 + fastjson 自定义S...
  • lzw_2006
  • lzw_2006
  • 2014年08月18日 01:52
  • 1512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python 进阶 —— 使用修饰器执行函数的参数检查
举报原因:
原因补充:

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