
Python 3.5 开始支持 Annotations ,可以用来给函数参数加上注解,也有一个叫 mypy 的库用它来做静态类型检查。
前几天发布 Validr 0.14.0 版,在 reddit 上也有人问支不支持 mypy ,今天突发奇想写了个用来运行时检查参数和返回值。
一个简单的实现:
# python >= 3.5 # pip install validr from validr import SchemaParser, mark_key def validation(f): """Decorator for validate function params and return by __annotations__""" parser = SchemaParser() return_ = None params = {} for k, v in f.__annotations__.items(): if k == 'return': return_ = parser.parse(v) else: params[k] = parser.parse(v) def wrapper(**kwargs): for k, v in params.items(): with mark_key(k): kwargs[k] = v(kwargs.get(k, None)) result = f(**kwargs) if return_: with mark_key('return'): result = return_(result) return result return wrapper @validation def login( username: 'str', password: 'str&minlen=6', ) -> { 'id?int': 'User ID', }: return {'id': 1000000} if __name__ == '__main__': print(login(username='guyskk', password='123456')) print(login(username='guyskk', password='1234')) 另外这种写法也是能实现的:
@validation def login( username: StringType(), password: StringType(minlen=6), ) -> { 'id': IntType(desc='User ID'), }: return {'id': 1000000} 大家觉得这两个写法怎么样,有需要这样一个库的吗