这是一个例子关于为函数添加强制性类型检查功能。使用装饰器实现。
特点:可以只对部分参数,类型进行检查。
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》
(完)