用python装饰器完成一个参数检查器,若参数是整形 数字在0-10之间,若是字符串 长度在8-16之间 若是数组list 则要求类型都是字符串 其他类型默认参数不能为空。如果校验不通过,则抛异常,通过则继续执行
import collections
import functools
import inspect
def para_check(func):
msg = 'Argument {argument} must be {expected!r},but got {got!r},value {value!r}'
# 获取函数定义的参数
sig = inspect.signature(func)
parameters = sig.parameters # 参数有序字典
arg_keys = tuple(parameters.keys())
@functools.wraps(func)
def wrapper(*args, **kwargs):
CheckItem = collections.namedtuple('CheckItem', ('anno', 'arg_name', 'value'))
check_list = []
# collect args *args 传入的参数以及对应的函数参数注释
for i, value in enumerate(args):
arg_name = arg_keys[i]
anno = parameters[arg_name].annotation
check_list.append(CheckItem(anno, arg_name, value))
# collect kwargs **kwargs 传入的参数以及对应的函数参数注释
for arg_name, value in kwargs.items():
anno = parameters[arg_name].annotation
check_list.append(CheckItem(anno, arg_name, value))
# check type
for item in check_list:
if not isinstance(item.value, item.anno):
error = msg.format(expected=item.anno, argument=item.arg_name,
got=type(item.value), value=item.value)
raise TypeError(error)
return func(*args, **kwargs)
return wrapper
@para_check
def test(x: int, y: int):
return x + y
test('1', 2)
Process finished with exit code 1