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

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

from inspect import signature   #可以检查数字签名
from functools import wraps


def 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 + y


print(add(2 , 3))
add(2, 'fff')

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

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值