实用:python中对实参类型进行校验(解决python是弱类型语言的弊端)

from functools import wraps
import inspect

def check(fn):
    @wraps(fn)
    def _check(*args, **kwargs):
        print(args, kwargs)
        sig = inspect.signature(fn)
        print(0,sig)
        params = sig.parameters
        print(1, params)
        params_lst = list(params.keys())
        print(2, params_lst)
        # 位置参数检查
        for i, v in enumerate(args):
            k = params_lst[i]

            if params[k].annotation is not inspect._empty and not isinstance(v, params[k].annotation):
                errstr = '{} {} {}'.format(v, 'is not', params[k].annotation)
                print(errstr)
                raise TypeError(errstr)
        # 关键字参数检查
        for k, v in kwargs.items():
            if params[k].annotation is not inspect._empty and not isinstance(v, params[k].annotation):
                errstr = '{} {} {}'.format(v, 'is not', params[k].annotation)
                print(errstr)
                raise TypeError(errstr)

        ret = fn(*args, **kwargs)
        return ret
    return _check

@check
def add(x:int=1, y:int=7) -> int:
    return x + y


print(add(5, 6))

运行结果:

(5, 6) {}
0 (x:int=1, y:int=7) -> int
1 OrderedDict([('x', ), ('y', )])
2 ['x', 'y']
11

你可能感兴趣的:(python,Python学习记录)