设为首页 收藏本站
查看: 862|回复: 0

[经验分享] schema 验证python数据格式

[复制链接]

尚未签到

发表于 2018-8-10 07:49:15 | 显示全部楼层 |阅读模式

  • 给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的子类)。

  • 给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则返回输入数据,否则抛出异常。

  • 给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

  • 给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的关系)

  • 给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都可以验证通过的话才返回数据,否则抛出异常,是不是感觉这种验证顿时感觉清爽了呢?

  • 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'}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-549381-1-1.html 上篇帖子: 【11】Python函数学习(上) 下篇帖子: 004-Python 基础语法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表