自定义函数强制类型检查的装饰器

来源:互联网 发布:2016年年残保金的算法 编辑:程序博客网 时间:2024/06/03 23:41

这是一个例子关于为函数添加强制性类型检查功能。使用装饰器实现。
特点:可以只对部分参数,类型进行检查。

from inspect import signature   #可以检查数字签名from functools import wrapsdef typeassert(*ty_args, **ty_kwargs):     #传入装饰器指定类型.    def decorate(func):        if not __debug__:    #如果__debug__被设置为False就返回未经修改的函数。            return func        sig = signature(func)       #函数允许我们从一个可调用对象中提取出参数签名信息。        bound_types = sig.bind_partial(*ty_args, **ty_kwargs).arguments     #bind_partial提供的类型到参数名做部分绑定,形成一个字典。输入的类型名和被装饰函数的参数进行绑定。        @wraps(func)   #保留元数据。        def wrapper(*args, **kwargs):    #传入被装饰函数的参数。            bound_values = sig.bind(*args, **kwargs)    #bind()也是进行绑定,当时不许减少参数,被装饰函数的变量名和输入参数绑定为一个字典。            for name, value in bound_values.arguments.items():   #拿出被装饰名字和值                if name in bound_types:   #拿出装饰器内有的输入x。                    if not isinstance(value, bound_types[name]):   #被装饰函数值类型是不是装饰器要求值,                        raise TypeError(               #触发异常。                            'Argument {} must be {}'.format(name, bound_types[name])                        )            return func(*args, **kwargs)        return wrapper    return decorate@typeassert(int, int)def add(x, y):    return x + yprint(add(2 , 3))add(2, 'fff')

执行结果
函数执行结果
参考自:《python cookbook》

(完)

原创粉丝点击