python时动态语言,变量随时可以被赋值,且能赋值为不同的类型,虽然很灵活但是这种特征也是弊端
def add(x,y):
return x+y
print(add(4,5)) ==》9
print(add('hello','world')) ==》‘helloword’
print(add(4,'hellow')) ==》error
由于python时一种强类型语言,不同类型不能想加,在第三个输出语句会报错,但是只有在函数执行的时候才会报错就会有以下问题
def add(x,y):
"""
:param x:int
:param y:int
:return :int
"""
return x+y
def add(x:int,y:int) ->int : 参数是 int 返回int
"""
:param x:int
:param y:int
:return :int
"""
retrn x+y
但这种方法也就是注解,值是让你使用函数的时候知道什么类型,但是不限定你调用的时候传入别的参数,也是只有在运行是报错
import inspect
def add(x:int,y:int,*args,**kwargs)->int:
return x+y
sig=inspect.signature(add)
print(sig)
print("params:",sig.parameters)
print("return",sig.return_annotation)
print(sig.parameters['y'])
print(sig.parameters['x'])
print(sig.parameters['args'])
print(sig.parameters['args'].annotation)
print(sig.parameters['kwargs'])
print(sig.parameters['kwargs'].annotation)
import inspect
def check(fn):
def wrapper(*args,**kwargs):
#实参检查
sig=inspect.signature(fn)
print(sig)
print("params",sig.parameters)
print("return",sig.return_annotation)
print(sig.parameters.values())
print("-------------")
params = sig.parameters #有序字典
#for param in sig.parameters.values():
# print(param.name,param.annotation,param.kind,param.default)
#print(args,kwargs)
print(params)
for k,w in kwargs.items():
if isinstance(w,params[k].annotation):
print(1,"kwargs")
else:
print(0,"kwargs")
param_list=list(params.values())
for i,v in enumerate(args):
if isinstance(v,param_list[i].annotation):
print(1,"args")
else:
print(0,"args")
res= fn(*args,**kwargs)
return res
return wrapper
@check
def add(x:int,y:int)->int:
return x+y