在 Python 中,我们经常需要对参数进行校验,这是我们有好多种方法,例如写很多 if 啊,或者写正则表达式啊等等,技巧高的人可以写得很巧妙,而技巧一般的人呢,可能会写得很冗长,例如我,经常就不能很好得处理参数校验的代码。
所以我就不断得寻找,终于最近发现了一个不错的 python 参数校验 lib,叫做 voluptuous。名字可能有点难记,而且英文翻译过来的中文还不怎么好听,但是非常好用。下面就逐渐带大家尝试一下 voluptuous 库的妙用。
安装 voluptuous
要用之前,肯定要先安装的啦,安装这一步很简单,还是按照往常一般使用 pip 搞定。我使用的是当前的最新版 0.8.8:
1 |
pip install voluptuous==0.8.8 |
尝试 voluptuous
首先,想来一个最为常见的,就是校验参数的类型,我这里假设参数都是以 json 格式进行传递的,json 格式在 python 中又可以表现为字典(dict),所以这里就不做区分了。
以官网的日志为例,使用分页的参数为例子,校验参数的类型,首先,我们要求参数的类型,查询的字段q
必须为字符串,分页大小per_page
必须为数字,页码page
必须为数字。
那么,使用 voluptuous 后,可以这样写:
1 2 3 4 5 6 7 |
from voluptuous import Schema s = Schema({ 'q': str, 'per_page': int, 'page': int }) |
这就表示了我们刚才的需求:查询的字段q
必须为字符串,分页大小per_page
必须为数字,页码page
必须为数字。
那么,现在,假设客户端传过来了一组参数:
1 2 3 4 |
{"q": "hello", "page": 10, "per_page": 20 } |
那么,我们要怎么来校验呢?也很简单:
1 2 3 4 5 6 7 8 9 10 11 12 |
from voluptuous import Schema s = Schema({ 'q': str, 'per_page': int, 'page': int }) print s({"q": "hello", "page": 10, "per_page": 20 }) |
这里可以看到,我们使用客户端传递过来的参数作为参数,调用了我们使用既定模板创建的对象,然后直接把他打印出来,如果你跑过这段代码,你会发现结果如下:
1 2 3 4 |
{"q": "hello", "page": 10, "per_page": 20 } |
没错, voluptuous 就是将校验通过的参数返回了。就是这么简单。
那这时,你可能要问了,如果校验不通过的参数怎么办,我要怎么处理,下面就演示一下如果传递的参数是:
1 2 3 4 |
{"q": "hello", "page": "world", "per_page": 20 } |
这样的话,要怎么来处理校验不通过的问题,其实,当校验不通过的时候,Schema 会抛出一个异常,然后我们可以通过捕获这个异常来确定校验失败的问题,例如:
1 2 3 4 |
try: print s({"q": "hello", "page": "world","per_page": 20}) except MultipleInvalid as e: print "error: {} occur while parse args".format(e.errors) |
当你执行这段代码之后,你会发现打印出来的内容是:
1 |
error: [TypeInvalid('expected int',)] occur while parse args |
我们就知道参数是有问题的,需要客户端确认。