题目
作业:开发一个语法糖,实现参数的类型准确性.。
提示:在python中,大家都知道python的数据类型是弱类型,比如说函数只允许传字符串
我的做法
# 关键字参数问题,小作业的解答
def runtime(func):
def get_time(*args, **kwargs): #依次解决多参数,关键字参数问题
for i in args:
if not isinstance(i, str):
print('NO!!')
print(type(kwargs))
for i, j in kwargs.items():
if not isinstance(j, str):
print('NO!!')
func(*args, **kwargs)
print(time.time())
return get_time
@runtime
def student_run(i, j):
print('学生跑!')
@runtime
def student_run1(*args, **kwargs):
# if not(type(args)== str and type(kwargs) == str):
# exit('NO!')
print('学生1跑!')
@runtime
def student_run2():
print('学生2跑!')
student_run(1, 2)
student_run1(5, 3, i = 1, j = 2)
student_run2()
# 关键字参数 key = value
大佬的做法
大佬一(薛玉洁)
import inspect
def looger(fn):
def wrapper(*args,**kwargs):
sig = inspect.signature(fn)
params = sig.parameters # parames 是形参 是一个元素为二元结构的有序字典,OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">), ('z', <Parameter "z:int=3">)]) # args,kwargs 是实参
va = list(params.values()) # 把字典中的值(形参)取出,用做列表处理
for arg, param in zip(args, va):
if param.annotation != inspect._empty and not isinstance(arg, param.annotation): #实参元素与形参元素进行对比判断类型
raise TypeError("you must input {}".format(param.annotation))
for k, v in kwargs.items():
if params[k].annotation != inspect._empty and not isinstance(v, params[k].annotation): # 实参中的K与形参中的K是一样的,K一样,只要进行value的类型判断即可
raise TypeError("you must input {}".format(params[k].annotation))
cc = fn(*args, **kwargs)
return cc
return wrapper
@looger
def add(x: int, y: int, z: int):
v = x + y + z
return v
add(3,6,z =5)
大佬二(海绵宝宝)推荐!!!
编写装饰器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(*types):
def required_int(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
for i in args:
if not isinstance(i,types):
print('TypeError',types)
#break
else:
inspect_res = fun(*args,**kwargs)
return inspect_res
return wrapper
return required_int
@required_types(str,int)
def add(*args,**kwargs):
print(args)
print(add(1,2,3,4,4,4,5,56,66,6,6,66,6,65,5,1))