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}
大家觉得这两个写法怎么样,有需要这样一个库的吗