Lesson91 Python中带参数的装饰器的应用示例
文章目录
1. 带参数的装饰器的应用示例
装饰器传入的参数都是函数,返回值也是函数
现在想给装饰器传入一般的参数
装饰器也是函数,现在只需要再装饰器外面再加一层即可
要求:编写装饰器required_types, 条件如下:
# 1). 当装饰器为@required_types(int,float)确保函数接收到的
每一个参数都是int或者float类型;
# 2). 当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
# 3). 当装饰器为@required_types(str,int)确保函数接收到的每
一个参数都是str或者int类型;
# 4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型
import functools
def required_types(*kinds): #定义带参数的装饰器函数
def required(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
for i in args:
if not isinstance(i,kinds): #如果实参的类型不满足形参的要求,打印类型错误
# print('TypeError:参数必须为',kinds)
# raise TypeError('参数必须为%s,%s' %kinds) #抛出异常(后面会学到)
else:
res = fun(*args,**kwargs)
return res
return wrapper
return required
@required_types(float,float)
def add(a,b):
return a+b
print(add(1.0,2.1))
可以看到,当传递的实参和题目要求的形参一致时,直接进行求和运算
将实参变为int型,而此时形参依然是float型,将异常抛出,可以看到,会报类型错误