继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

schema 验证python数据格式

繁星coding
关注TA
已关注
手记 238
粉丝 10
获赞 55

  1. 给Schema类传入类型(int、str、float等)

from schema import Schema
Schema(int).validate(10)
10
Schema(int).validate('10')
SchemaUnexpectedTypeError: '10' should be instance of 'int'
可见Schema会去验证validate方法传入的对象是不是所指定的类型,是则返回传入的数据,
否则抛出一个SchemaError的异常(SchemaUnexpectedTypeError是SchemaError的子类)。

  1. 给Schema类传入可调用的对象(函数、带call的类等)

Schema(lambda x: 0<x<10).validate(5)
5
Schema(lambda x: 0<x<10).validate(57)
SchemaError: <lambda>(57) should evaluate to True
可见Schema会把validate方法传入的值传入到对应的函数里面作为参数,如果函数返回值为True则返回输入数据,否则抛出异常。

  1. 给Schema类传入带有validate方法的对象
    Schema也内置了一些类(Use、And、Or等等),这些类的实例都带有validate方法,亦可作为Schema的参数传入,例如:

from schema import Schema, And

And代表两个条件必须同时满足,or是满足其中之一

Schema(And(str, lambda s: len(s) > 2)).validate('abcd')
'abcd'
#use转换数值类型

>> Schema(Use(int)).validate('123')
123

  1. 给Schema类传入容器对象(list、tuple、set等)
    例如:

Schema([int, float]).validate([1, 2, 3, 4.0])
[1, 2, 3, 4.0]
#相当于,对于[1, 2, 3, 4.0]当中的任何一个元素,必须是int或者float才行(注意是or的关系)

  1. 给Schema传入一个字典对象(大部分使用Schema的场景都是传入字典对象,这个很重要)

Schema({'name': str, 'age': int}).validate({'name': 'foobar', 'age': 18})
{'age': 18, 'name': 'foobar'}
Schema({'name': str, 'age': int}).validate({'name': 'foobar'})
SchemaMissingKeyError: Missing keys: 'age'

#首先,明确两个概念,Schema类传入的字典,称之为模式字典,valdiate方法传入的字典称之为数据字典。
#首先,Schema会判断, 模式字典和数据字典的key是否完全一样,不一样的话直接抛出异常。如果一样,就去拿数据字典的value去验证模式字典相应的value,如果数据字典的全部value都可以验证通过的话才返回数据,否则抛出异常,是不是感觉这种验证顿时感觉清爽了呢?

  1. faqs
    #Schema传入字典很好用,但是我有的数据是可选的,也就是说有的key可以不提供怎么办?

#option 是可选项

from schema import Optional, Schema

Schema({'name': str, Optional('age'): int}).validate({'name': 'foobar'})
{'name': 'foobar'}

Schema({'name': str, Optional('age', default=18): int}).validate({'name': 'foobar'})
{'age': 18, 'name': 'foobar'}

#我想让Schema只验证传入字典中的一部分数据,可以有多余的key但是不要抱错,怎么做?
Schema({'name': str, 'age': int}, ignore_extra_keys=True).validate({'name': 'foobar', 'age': 100, 'sex': 'male'})
{'age': 100, 'name': 'foobar'}

#Schema自带的类(Use、And、Or、Regex、Schema等)都有一个参数error,可以自定义错误信息

Schema({'name': str, 'age': Use(int, error='年龄必须是整数')}).validate({'name': 'foobar', 'age': 'abc'})
SchemaError: 年龄必须是整数
#ignore_extra_keys 忽略其他key的检查
schema = Schema({'name': str}, ignore_extra_keys=True)
schema.validate({'name': 'Sam', 'age': '42'})
{'name': 'Sam'}

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP