标签:类型检查 zha 说明 == 类方法 编译型 位置 nbsp 增加
def add(x,y): return x+y print(add(4,5)) print(add(‘hello‘,‘world‘)) print(add(4,‘hello‘)) #报错,TypeError: unsupported operand type(s) for +: ‘int‘ and ‘str‘
如何解决这种动态语言定义的弊端呢?
def add(x,y): """ :param x:int :param y:int :return:int """ return x+y print(help(add))
def add(x:int,y:int)->int: """ :param x:int :param y:int :return:int """ return x+y print(help(add)) print(add(4,5)) print(add("jax","zhai")) #在pycharm里参数是灰色
思路:
inspect模块
import inspect def add(x:int,y:int,*args,**kwargs)->int: return x+y sig = inspect.signature(add) print(sig,type(sig)) #获取签名 print(‘params :‘,sig.parameters) #OrderedDict print(‘return :‘,sig.return_annotation) #返回值类型 print(sig.parameters[‘y‘], type(sig.parameters[‘y‘])) print(sig.parameters[‘x‘].annotation) print(sig.parameters[‘args‘]) print(sig.parameters[‘args‘].annotation) print(sig.parameters[‘kwargs‘]) print(sig.parameters[‘kwargs‘].annotation)
inspect.isfunction(add) #是不是函数 inspect.ismethod(add) #是不是类方法 inspect.isgenerator(add) #是不是生成器 inspect.isclass(add) #是不是类 inspect.ismodule(add) #是不是模块 inspect.isbuiltin(add) #是不是内建对象
举例:
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(‘~~~~~~~~~~~~~~~~‘) for i,item in enumerate(sig.parameters.items()): name,param = item print(i+1,name,param.annotation,param.kind,param.default) print(param.default is param.empty, end = ‘\n\n‘)
有函数如下:
def add(x,y:int=7) -> int: return x + y
def check(fn): def wrapper(*args,**kwargs): sig = inspect.signature(fn) params = sig.parameters values = list(params.values()) #print(values) for i,p in enumerate(args): # print(i,p) params = values[i] #print(params.annotation,params.empty) if params.annotation is not params.empty and not isinstance(p,params.annotation): print(p,‘!==‘,values[i].annotation) for k,v in kwargs.items(): if sig.parameters[k].annotation is not inspect._empty and not isinstance(v,sig.parameters[k].annotation): print(k,v,‘!===‘,sig.parameters[k].annotation) return fn(*args,**kwargs) return wrapper @check def add(x,y:int=7) -> int: return x + y #print(add(20,10)) print(add(20,y=10)) print(add(y=10,x=20))
标签:类型检查 zha 说明 == 类方法 编译型 位置 nbsp 增加
原文地址:https://www.cnblogs.com/xzkzzz/p/11378842.html