使用decorator对函数参数进行简单验证。
validoot的Python项目详细描述
本模块旨在解决最基本的参数验证: 子句的类型、子句和组合。它是用来移除一些 用于检查输入类型和检查 介于或字符串长度之间。
github网址:https://github.com/AstromechZA/validoot
pypi url:https://pypi.python.org/pypi/validoot/1.3
定义
- 子句-将值作为参数并 返回True或False。
- 运算符-允许您将“and”和“or”子句放在一起。
基本示例:
fromvalidootimportvalidates,inst,typ,between@validates(inst(basestring),typ(int),between(0,100))defdo_something(name,id,age):pass
在上面的代码中,如果 name不是字符串或Unicode,如果id不是整数,或者 如果age不在0和100之间。
>>>do_something('Darth Vader',0,42)>>>do_something('Boba Fett',1,123)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"validoot/decorators.py",line25,in__call__self.positional_validators[i],args[i],i))validoot.exceptions.ValidationError:Validation<inrange[0..100)>failedforvalue123(arg[2])
操作员:
我们可以通过为 name:它必须在5到40个字符之间。为此,我们使用 validoot.And运算符来组合子句。
fromvalidootimportvalidates,inst,typ,between,len_between,And@validates(And(inst(basestring),len_between(5,40)),typ(int),between(0,100))defdo_something(name,id,age):pass
a^ {tt9} $运算符也存在。And和Or都接受 子句数目可变,可以进一步嵌套。
提供了运算符快捷方式,用于在不同的 不同的读取方式(._and(...),._or(...))。所以我们 前面的示例可以改为如下:
fromvalidootimportvalidates,inst,typ,between,len_between@validates(inst(basestring)._and(len_between(5,40)),typ(int),between(0,100))defdo_something(name,id,age):pass
运算符也可以以更复杂的方式组合:
inst(basestring)._and(len_between(5,40))._or(typ(int))
关键字参数:
还支持关键字参数:
fromvalidootimportvalidates,inst,typ@validates(inst(basestring),something=typ(float))defdo_something(name,something=1.0,anotherthing=2):pass
这里,something值必须作为 在装饰器中指定。对于{{tt15} $,不存在任何检查 没有限制。
修饰类/静态/实例方法或构造函数:
也可以用完全相同的方式验证属于类的方法 就像上面的例子。请注意^{tt16}的顺序$ decorator和其他decorator,如@classmethod或@staticmethod。
classSomeClass(object):# classmethod MUST be the innermost decorator!@validates(typ(int))@classmethoddefsome_class_method(cls,an_integer):returnan_integer# staticmethod can be outer or inner decorator@staticmethod@validates(typ(float))defsome_static_method(a_floater):returna_floater@validates(typ(string))defsome_instance_method(self,a_string):returna_string
为了验证传递给构造函数的参数,验证 decorator应该位于类本身:
@validates(typ(string))classSomeClass(object):def__init__(self,username):self.username=username
附加条款:
包中包含一些更复杂的条款:
- _:下划线只允许NoneType。
- numeric:只接受int、float或long类型。
- text:只接受basestring(python 2)或 str(Python3)。
- positive:只有正数
- negative:只有正数
- email_address:简单的regex电子邮件检查(包括大多数基本示例)
- ip_address:仅接受IPv4地址
- url:简单的regex url检查(包括大多数基本示例)
这些可以在validoot.builtins模块中找到。
常见问题解答:
如果我不想验证其中一个立场论点呢?
很简单。只需使用None。
fromvalidootimportvalidates,inst,between@validates(inst(basestring),None,between(0,100))defdo_something(name,id,age):pass
内置哪些验证子句?
- typ(t)-值必须是精确类型t
- inst(t)-值必须是精确类型t或子类
- between(lower, upper, lower_inc=True, upper_inc=False)-这个 值必须介于lower和upper之间。lower_inc和upper_inc 表示范围包容性。
- len_between(...)-与between相同,但使用 len(value)
- regex(string)-值必须与提供的regex字符串匹配
- list_of(v)-值必须是通过验证的对象列表v
- dict_of(v1, v2)-值必须是一个字典,其中每个键通过验证v1,每个值通过验证v2
如何创建自己的验证条款?
validoot提供的内置子句都是 validoot.clauses.Clause对象。查看它的源代码 它们是如何工作的。从技术上讲,子句可以是任何简单的可调用对象 函数或lambda也可以工作。