python通过装饰器检查函数参数数据类型的方法

yipeiwu_com7年前Python基础

本文实例讲述了python通过装饰器检查函数参数数据类型的方法。分享给大家供大家参考。具体分析如下:

这段代码定义了一个python装饰器,通过此装饰器可以用来检查指定函数的参数是否是指定的类型,在定义函数时加入此装饰器可以非常清晰的检测函数参数的类型,非常方便

复制代码 代码如下:
def accepts(exception,**types):
    def check_accepts(f):
        assert len(types) == f.func_code.co_argcount, \
        'accept number of arguments not equal with function number of arguments in "%s"' % f.func_name
        def new_f(*args, **kwds):
            for i,v in enumerate(args):
                if types.has_key(f.func_code.co_varnames[i]) and \
                    not isinstance(v, types[f.func_code.co_varnames[i]]):
                    raise exception("arg '%s'=%r does not match %s" % \
                        (f.func_code.co_varnames[i],v,types[f.func_code.co_varnames[i]]))
                    del types[f.func_code.co_varnames[i]]
            for k,v in kwds.iteritems():
                if types.has_key(k) and not isinstance(v, types[k]):
                    raise exception("arg '%s'=%r does not match %s" % \
                        (k,v,types[k]))
            return f(*args, **kwds)
        new_f.func_name = f.func_name
        return new_f
    return check_accepts
def exmaple():
    @accepts(Exception,a=int,b=list,c=(str,unicode))
    def test(a,b=None,c=None)
        print 'ok'
    test(13,c=[],b='df')

希望本文所述对大家的Python程序设计有所帮助。

相关文章

Python re模块介绍

Python中转义字符 正则表达式使用反斜杠” \ “来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用” \\\\ “表示正则表达式中的” \ “,因为正...

对python函数签名的方法详解

函数签名对象,表示调用函数的方式,即定义了函数的输入和输出。 在Python中,可以使用标准库inspect的一些方法或类,来操作或创建函数签名。 获取函数签名及参数 使用标准库的sig...

Python程序设计入门(4)模块和包

Python语言功能非常强大,除了类之外,还有模块和包的概念,这有点像perl,此处简单说说包和模块。 一、Python中的模块 模块——其实就是我们说的库(lib)的概念,不过它不仅只...

Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)

Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)

 anaconda 集成了很多科学计算中所需要的包,如numpy,scipy等等,具体查看anaconda中已经预先安装配置好的包有哪些,可以通过cmd命令,输入conda l...

python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件

本文实例讲述python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件的方法,该程序采用python 2.7编写。主要内容如下: 经过长期搜寻,终于找到了Moxa...