使用decorator对函数参数进行简单验证。

validoot的Python项目详细描述


本模块旨在解决最基本的参数验证: 子句的类型、子句和组合。它是用来移除一些 用于检查输入类型和检查 介于或字符串长度之间。

github网址:https://github.com/AstromechZA/validoot

pypi url:https://pypi.python.org/pypi/validoot/1.3

定义

  • 子句-将值作为参数并 返回TrueFalse
  • 运算符-允许您将“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} $运算符也存在。AndOr都接受 子句数目可变,可以进一步嵌套。

提供了运算符快捷方式,用于在不同的 不同的读取方式(._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:只接受intfloatlong类型。
  • 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)-这个 值必须介于lowerupper之间。lower_incupper_inc 表示范围包容性。
  • len_between(...)-与between相同,但使用 len(value)
  • regex(string)-值必须与提供的regex字符串匹配
  • list_of(v)-值必须是通过验证的对象列表v
  • dict_of(v1, v2)-值必须是一个字典,其中每个键通过验证v1,每个值通过验证v2

如何创建自己的验证条款?

validoot提供的内置子句都是 validoot.clauses.Clause对象。查看它的源代码 它们是如何工作的。从技术上讲,子句可以是任何简单的可调用对象 函数或lambda也可以工作。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java通过Spring MVC web应用程序向客户端发送文本文件   java是否可以在运行时动态实例化DAO类?   调用VB。来自Java的net函数   java在Android中通过单击打开特定文件夹   java如何使用maven pom。xml标识非标准项目结构中的testng测试用例?   java为什么FOP在大文件上崩溃?   Architecture python+flask和spring boot+java   java Kafka工具根本没有启动Ubuntu 19.10   如何使用Eclipse运行Java USB API for Windows   java如何在Eclipse中查看J2EE预览服务器/容器的日志/控制台?   网页抓取是否可以使用Java crawler crawler4j暂停和恢复抓取?   java当我第二次按下按钮时,应用程序停止工作   带有偏移量和限制的java SQLite分页问题   java如何在OSX mavericks中将端口80转发到8080   java从泛型方法调用非泛型方法   java My代码未按预期工作。十进制输出不是它应该的样子   节点。java中的js加密(jasypt)和nodejs中的解密   java乘法表不工作数组索引超出范围   java将JDBC与Firebirdsql连接起来