一个简单且可扩展的模式验证器。

py-schema的Python项目详细描述


py_模式

一个简单且可扩展的模式验证器。

traviscodecov

安装

pip install py-schema

用法

frompy_schemaimportSchemaValidator,SchemaValidationErrorfrompy_schemaimportDictField,ListField,StrField,IntFieldschema=DictField(schema={'name':StrField(min_length=2,max_length=50),'age':IntField(min=0,max=130),'pets':ListField(min_items=1,item_schema=StrField())})value={'name':'Bruce','age':40,'pets':['Billy',False]}try:validator=SchemaValidator(schema=schema,value=value)validator.validate()exceptSchemaValidationErroraserr:print(err.code)# STR_TYPEprint(err.path)# $root.pets.$1

您可以检查每个字段规范中错误的完整列表。

字段

基场

这是所有字段继承自的抽象字段。

它有一些共享道具,你可以在所有领域使用。

必需的

如果标记为True(默认值),并且值为None,则会引发REQUIRED_VALUE错误。

frompy_schemaimportSchemaValidator,SchemaValidationError,StrFieldtry:schema=StrField(required=True)value=Nonevalidator=SchemaValidator(schema,value)validator.validate()exceptSchemaValidationErroraserr:print(err.code)# "REQUIRED_VALUE"

intfield

验证值是否为整数。

frompy_schemaimportSchemaValidator,IntFieldschema=IntField(min=1,max=100)value=80validator=SchemaValidator(schema,value)validator.validate()

min(int,可选,默认无)

如果提供,它将验证该值是否为min的>;=值。

否则,将引发一个INT_MIN错误。

max(int,可选,默认无)

如果提供,它将验证该值是否为max的<;=值。

否则,将引发一个INT_MAX错误。

strfield

验证值是否为字符串。

frompy_schemaimportSchemaValidator,StrFieldschema=StrField(min_length=2,max_length=50)value='Luca Turilli'validator=SchemaValidator(schema,value)validator.validate()

最小长度(int,可选,默认无)

如果提供,它将验证字符串len是否为min_length的>;=值。

否则,将引发一个STR_MIN_LENGTH错误。

最大长度(int,可选,默认无)

如果提供,它将验证字符串len是否为max_length的<;=值。

否则,将引发一个STR_MAX_LENGTH错误。

浮场

验证该值是否为浮点值。

frompy_schemaimportSchemaValidator,FloatFieldschema=FloatField(min=0.0,max=99.0)value=50.0validator=SchemaValidator(schema,value)validator.validate()

min(int,可选,默认无)

如果提供,它将验证该值是否为min的>;=值。

否则,将引发一个FLOAT_MIN错误。

max(int,可选,默认无)

如果提供,它将验证该值是否为max的<;=值。

否则,将引发一个FLOAT_MAX错误。

布尔菲尔德

验证该值是否为布尔值。

frompy_schemaimportSchemaValidator,BoolFieldschema=BoolField()value=Falsevalidator=SchemaValidator(schema,value)validator.validate()

dictfield

验证该值是否为dict及其内部的每个字段。

frompy_schemaimportSchemaValidator,DictField,StrField,BoolFieldschema=DictField(schema={'name':StrField(),'admin':BoolField(),'contacts':DictField(schema={'phone':StrField(),'email':StrField()},optional_props=['phone'])},strict=True,optional_props=['contacts'])value={'name':'Dargor The Lord','admin':True,'contacts':{'email':'dargor@blackmountain.com'}}validator=SchemaValidator(schema,value)validator.validate()

模式(dict,必需)

字典的定义。

严格(bool,可选,默认为false)

架构是否应拒绝架构中不存在的字典键。

例如:

frompy_schemaimportSchemaValidator,SchemaValidationError,DictField,StrField,BoolFieldtry:schema=DictField(schema={'name':StrField(),'admin':BoolField()},strict=True)value={'name':'Dargor The Lord','admin':True,'contacts':{'email':'dargor@blackmountain.com'}}validator=SchemaValidator(schema,value)validator.validate()exceptSchemaValidationErroraserr:print(err.code)# DICT_PROP_NOT_ALLOWEDprint(err.extra)# {'prop': 'contacts'}

在这种情况下,值中的contacts属性不在架构中。

它将引发一个DICT_PROP_NOT_ALLOWED

可选道具([str],可选,默认[])

此属性指示架构中哪些属性是可选的。

如果某个道具在此列表中,但不在该值中,则将忽略该道具。

否则,将引发一个DICT_PROP_MISSING错误。

示例:

frompy_schemaimportSchemaValidator,DictField,StrField,BoolFieldschema=DictField(schema={'name':StrField(),'admin':BoolField(),'gender':StrField()},optional_props=['gender'])value={'name':'Dargor The Lord','admin':True}validator=SchemaValidator(schema,value)validator.validate()# valid
frompy_schemaimportSchemaValidator,SchemaValidationError,DictField,StrField,BoolFieldtry:schema=DictField(schema={'name':StrField(),'admin':BoolField()})value={'name':'Dargor The Lord'}validator=SchemaValidator(schema,value)validator.validate()exceptSchemaValidationErroraserr:print(err.code)# DICT_PROP_MISSINGprint(err.extra)# {'prop': 'admin'}

列表字段

验证该值是否为列表及其内的项。

frompy_schemaimportSchemaValidator,ListField,StrFieldschema=ListField(min_items=1,max_items=3,item_schema=StrField())value=['Emerald','Sword']validator=SchemaValidator(schema,value)validator.validate()

项目架构(basefield,必需)

列表中项的架构。

最小项(int,可选,默认无)

验证列表是否包含最小长度min_items

否则,将引发LIST_MIN_ITEMS错误。

最大项目数(int,可选,默认无)

验证列表是否包含最大^ ^ }长度。

否则,将引发LIST_MAX_ITEMS错误。

枚举字段

验证该值是否为允许值之一。

frompy_schemaimportSchemaValidator,EnumFieldschema=EnumField(accept=[1,True,'Immortal'])value=1validator=SchemaValidator(schema,value)validator.validate()

接受(列表,必需)

可以接受的值的列表。

如果该值不在accepted中,则会引发ENUM_VALUE_NOT_ACCEPT错误。

regex字段

验证该值是否与正则表达式匹配。

frompy_schemaimportSchemaValidator,RegexFieldschema=RegexField(regex='\\d{5}\\Z')value='12345'validator=SchemaValidator(schema,value)validator.validate()

正则表达式(str,必需)

正则表达式模式。

或字段

验证该值是否与至少一个给定架构匹配。

frompy_schemaimportOrField,StrField,BoolField,IntField,SchemaValidator,SchemaValidationErrorschema=OrField(schemas=[StrField(),IntField()])value=Truevalidator=SchemaValidator(schema,value)try:validator.validate()exceptSchemaValidationErrorase:print(e.extra['errors'])

架构([basefield],必需)

要验证的架构的列表。 如果所有模式都失败了,它将引发一个OR_NO_MATCHING_SCHEMA错误。

如果验证失败,可以检查错误属性extra['errors'],查看所有验证结果。

其他

计划错误

如果验证失败,它将引发一个SchemaValidationError

在错误的一侧将有:

frompy_schemaimportSchemaValidationErrortry:# ....passexceptSchemaValidationErroraserr:print(err.code)# The code of the errorprint(err.path)# The path in the schema that the error occurred.print(err.node)# The BaseField node where the validation was raised.print(err.extra)# Any extra argument of the error.

创建自定义验证器

为了获得更好的上下文,我们使用以下示例:

frompy_schemaimportDictFieldfrom.my_fieldimportMyFieldschema=DictField(schema={'my_field':MyField()})value={'my_field':'Avalon'}
frompy_schemaimportBaseFieldclassMyField(BaseField):defvalidator(self):ctx=self.ctx# the current SchemaValidator instancevalue=self.value# here is the current value of the schema (in this sample: "Avalon")ifvalue!='Avalon':# create you custom validationself.raise_error(# if your validation fails, raise an errorcode='MY_CUSTOM_CODE',extra="Any other extra info for your error (optional)")

就这样。

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

推荐PyPI第三方库


热门话题
用Java将dpi元数据写入jpeg图像   文件为什么Java会自动解码URI编码的文件名中的%2F?   java多动态时间事件侦听器   java中如何递归查找不同级别的属性值   java Apache Spark MySQL JavaRDD。foreachPartition为什么我得到ClassNotFoundException   Java中的循环变量文件名   java如何参数化调用JNA库的C库名称和路径?   swing如何使gif在Java中运行一次并停止?   Big Sur上的MacOS应用程序,具有java子进程和可访问性API权限   在page类中定义的java Webelement在测试类中不可访问   如何使用java if else从JSON文件中删除重复的元素?   java Android studio dalvik vm找不到类   java在数组中正确使用协方差