schema 驗證python數據格式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章