使用funcsigsParameter()生成多个参数的装饰器
发布时间:2024-01-08 02:55:46
在Python中,可以使用inspect.signature模块下的funcsigs.Parameter类来生成多个参数的装饰器。funcsigs.Parameter类用于表示函数或方法的参数。
下面是一个使用funcsigs.Parameter生成多个参数的装饰器的例子:
import inspect
import functools
import funcsigs
def validate_args(func):
signature = inspect.signature(func) # 获取被装饰函数的签名
parameters = signature.parameters # 获取被装饰函数的参数
@functools.wraps(func)
def wrapper(*args, **kwargs):
# 遍历参数,检查每个参数的类型是否合法
for name, parameter in parameters.items():
if name == 'self':
continue
if name in kwargs:
value = kwargs[name]
elif parameter.default != inspect.Parameter.empty:
value = parameter.default
else:
try:
value = args[parameter.position]
except IndexError:
raise TypeError(f"缺少参数:{name}")
if not isinstance(value, parameter.annotation):
raise TypeError(f"参数类型错误:{name}")
return func(*args, **kwargs)
return wrapper
@validate_args
def add_numbers(a: int, b: int) -> int:
return a + b
print(add_numbers(3, 4)) # 输出:7
print(add_numbers(3.5, 4)) # 抛出TypeError,参数类型错误:a
在上面的例子中,我们定义了一个装饰器validate_args,它接受一个函数作为参数,并返回一个装饰后的函数。
在装饰器内部,我们使用inspect.signature函数获取被装饰函数的签名信息,并使用signature.parameters获取函数的参数。然后,我们遍历参数列表,检查每个参数的类型是否合法。
如果发现参数类型错误,我们抛出TypeError异常,提示参数类型错误的具体信息。
装饰器中的wrapper函数使用*args和**kwargs接收传递给被装饰函数的参数,并依次检查每个参数的类型。如果参数是通过关键字方式传递的,则从kwargs中获取,如果是通过位置方式传递的,则从args中获取。
最后,如果参数类型检查通过,我们调用原始的被装饰函数,并返回其结果。
在使用@validate_args装饰器修饰的add_numbers函数中,我们给a和b参数加上了类型注解(int类型),装饰器会根据类型注解来检查参数的类型是否匹配。
