python笔记:类型检验 在python3中,可以使用函数注解,类似这样: def print(input :str) -> int: pass 函数注解可以用内置方法获取,所以可以利用这个特性做一个类型检验的装饰器。 代码如下: ```python import functools import inspect def typeassert(fn): """ provide type assert, examples: #normal @typeassert def hello(name: str): return name + "world" #check return @typeassert def hello2(name: str, count: int=5) -> (int, int, int): print("{} {} say hello".format(count, name)) return 0, 1, 2 :param fn:input funcs :return: """ @functools.wraps(fn) def wrap(*args, **kwargs): sig = inspect.signature(fn) parameters = sig.bind_partial(*args, **kwargs).arguments.items() anno = fn.__annotations__ for element_name, value in parameters: if element_name in anno: if not isinstance(value, anno[element_name]): raise TypeError( "{}:{} type not {}".format(element_name, value, anno[element_name]) ) ret = fn(*args, **kwargs) if 'return' not in anno: return ret anno_return = anno['return'] if isinstance(anno_return, type): if not isinstance(ret, anno_return): raise TypeError("return value {} != {}".format(ret, anno_return)) elif isinstance(anno_return, (list, tuple)): if len(ret) != len(anno_return): raise TypeError("return value count {} != {}".format(len(ret), len(anno_return))) for key, ret_value in enumerate(ret): if not isinstance(ret_value, anno_return[key]): raise TypeError( "return value index:{}({}) type not {}".format(key, ret_value, anno_return[key]) ) return ret return wrap ``` 来自 大脸猪 写于 2016-11-26 17:04 -- 更新于2020-10-19 13:06 -- 0 条评论