一个简单且可扩展的模式验证器。
py-schema的Python项目详细描述
py_模式
一个简单且可扩展的模式验证器。
安装
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)")
就这样。