pyextend - python extend lib

accepts(exception=TypeError, **types)

参数:

exception: 检查失败时的抛出异常类型

**types: 待检查的k-v参数

**types参数支持

a=int : 待测函数参数a必须为 int 类型, 否则检查失败

b='__iter__' : 待测参数 b 必须为 实现 __iter__ 函数的 iterable类型

c=('__iter__', None) : 待测参数 c 必须为实现 __iter__函数的 iterable类型或者None.

范例:

    Example 1:
@accepts(a=int, b='__iter__', c=str)
def test(a, b=None, c=None):
print('accepts OK') test(13, b=[], c='abc') -- OK
test('aaa', b=(), c='abc') --Failed Example 2:
@accepts(a=int, b=('__iter__', None), c=str)
def test(a, b=None, c=None):
print('accepts OK') test(13, b=[], c='abc') -- OK
test(13, b=None, c='abc') -- OK

代码:

def accepts(exception=TypeError, **types):
"""
A wrapper of function for checking function parameters type
""" def check_param(v, type_or_funcname):
if isinstance(type_or_funcname, tuple):
results1 = [check_param(v, t) for t in type_or_funcname if t is not None]
results2 = [v == t for t in type_or_funcname if t is None]
return any(results1) or any(results2) is_type_instance, is_func_like = False, False
try:
is_type_instance = isinstance(v, type_or_funcname)
except TypeError:
pass
if isinstance(type_or_funcname, str):
is_func_like = hasattr(v, type_or_funcname) return is_type_instance or is_func_like def check_accepts(f):
assert len(types) <= f.__code__.co_argcount,\
'accept number of arguments not equal with function number of arguments in "{}"'.format(f.__name__) @functools.wraps(f)
def new_f(*args, **kwargs):
for i, v in enumerate(args):
if f.__code__.co_varnames[i] in types and \
not check_param(v, types[f.__code__.co_varnames[i]]):
raise exception("function '%s' arg '%s'=%r does not match %s" %
(f.__name__, f.__code__.co_varnames[i], v, types[f.__code__.co_varnames[i]]))
del types[f.__code__.co_varnames[i]] for k, v in kwargs.items():
if k in types and \
not check_param(v, types[k]):
raise exception("function '%s' arg '%s'=%r does not match %s" % (f.__name__, k, v, types[k]))
return f(*args, **kwargs)
return new_f
return check_accepts

pyextend库-accepts函数参数检查的更多相关文章

  1. Python 带参数的装饰器 [2] 函数参数类型检查

    在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...

  2. python通过装饰器检查函数参数的数据类型的代码

    把内容过程中比较常用的一些内容记录起来,下面内容段是关于python通过装饰器检查函数参数的数据类型的内容. def check_accepts(f): assert len(types) == f. ...

  3. isNaN() 函数用于检查其参数是否是非数字值。如果是非数字值则返回true

    isNaN() 函数用于检查其参数是否是非数字值.如果是非数字值则返回true.document.write(isNaN(0)); falsedocument.write(isNaN("He ...

  4. python定义函数以及参数检查

    (转自廖雪峰网站) 函数定义 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义 ...

  5. PHP笔记4__函数/全局、静态变量/函数参数/加载函数库/,,

    <?php header("Content-type: text/html; charset=utf-8"); echo table(5,5); function table ...

  6. PostgreSql扩展Sql-动态加载共享库(C函数)

    基于 psql (PostgreSQL) 10.4 pg_language表定义了函数实现所使用的语言.主要支持了C语言和SQL语句.一些可选的语言包括pl/pgsql.tcl和perl. ligan ...

  7. golang 防SQL注入 基于反射、TAG标记实现的不定参数检查器

    收到一个任务,所有http的handler要对入参检查,防止SQL注入.刚开始笨笨的,打算为所有的结构体写一个方法,后来统计了下,要写几十上百,随着业务增加,以后还会重复这个无脑力的机械劳作.想想就l ...

  8. 如何优雅的传递 stl 容器作为函数参数来实现元素插入和遍历?

    问题背景 开始正文之前,做一些背景铺垫,方便读者了解我的工程需求.我的项目是一个客户端消息分发中心,在连接上消息后台后,后台会不定时的给我推送一些消息,我再将它们转发给本机的其它桌面产品去做显示.后台 ...

  9. Python函数参数和注解是什么

    四种参数 Python函数func定义如下: def func(first, *args, second="Hello World", **kwargs): print(first ...

随机推荐

  1. Spring boot Mybatis整合构建Rest服务(超细版)

     Springboot+ Mybatis+MySql整合构建Rest服务(涵盖增.删.改.查) 1.概要 1.1 为什么要使用Spring  boot? 1.1.1 简单方便.配置少.整合了大多数框架 ...

  2. hdu Exponentiation高精度实数乘幂(用了带小数的高精度模板)

    #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #i ...

  3. C++的前置++、后置++和前置--、后置--

    一.C++的前置++和后置++ 在C++中,运算符重载是你必须要掌握的重点,而前置++和后置++有什么区别呢?其实前置++和后置++是有关于 影响效率的问题,前置++比后置++的效率要高,原因是因为前 ...

  4. CentOS6安装各种大数据软件 第十章:Spark集群安装和部署

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  5. docker 入门 (二)基本操作

    这一篇讲docker的基本操作. 请自行安装docker到自己的电脑上. 镜像的获取 要获取镜像,最简单的当然是从仓库去获取,docker的官方网站很不好练,其他的可选项有docker中国官网,阿里镜 ...

  6. Python中级 —— 02函数式编程

    函数式编程 函数是Python内建支持的一种封装,而函数式编程通俗说来就是把函数本身作为参数传入另一个函数,允许返回一个函数. 函数名其实也是变量,也可以被赋值.如果函数名被赋值为其他值,则不再指向原 ...

  7. python range,xrange区别

    range: 直接生成一个列表对象 xrange: 生成一个xrange对象 xrange使用: 操作一个非常大的数据时,而且没存比较吃紧的时,可以使用xrange来节省内存 xrange一般在循环里 ...

  8. pgsql 变量赋值方法

    1.网上一般说的方法如下: :=,赋值,比如user_id := 20; select into 赋值,比如 SELECT INTO myrec * FROM emp WHERE empname = ...

  9. 一个sqoop export案例中踩到的坑

    案例分析: 需要将hdfs上的数据导出到mysql里的一张表里. 虚拟机集群的为:centos1-centos5 问题1: 在centos1上将hdfs上的数据导出到centos1上的mysql里: ...

  10. nohup和&后台运行,进程查看及终止 详解

    nohup 和重定向 功能一样,可用于定时启动 1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg … ] [ & ] 无论是否将 nohup 命令的输出重 ...