Python Schema
2019-08-27 本文已影响0人
JM68
WHAT?
schema是一个用于验证Python数据结构的库,例如从配置文件,表单,外部服务或命令行解析获得的数据结构,从JSON / YAML(或其他)转换为Python数据类型。
- 安装
pip install schema
Example
- 基础验证
from schema import Schema, And, Optional, Use
# 定义数据结构(列表中的字典)
# And表示需同时满足 (字符串+长度(表示不能为空))
# Use表示转换 若使用'80'会转为int80 加入lambda表达式可以增加验证条件
# Optional表示可选, 字典中可以包含可以不包含
# 如果字典需要不包含的键值在字典中使用 ignore_extra_keys=True
schema = Schema([{'name': And(str, len),
'age': And(Use(int), lambda x: 18 <= x <= 99),
Optional('gender'): And(str, Use(str.lower), lambda s: s in ('squid', 'kid'))}])
data = [{'name': 'jmd', 'age': 18},
{'name': 'zbj', 'age': '80'},
{'name': 'hhs', 'age': 18, 'gender': 'Kid'}]
print(schema.validate(data))
- 设置默认值
a = Schema({Optional('data', default="abc"): And(str, len)})
print(a.validate({})) # 输出结果:{'data': 'abc'}
print(a.validate({'data': "bcd"})) # 输出结果:{'data': 'bcd'}
print(a.is_valid({'data': "bcd"})) # 输出 True
- 密码验证
# 表示pwd,password两者只能有一个, 结果必须为字符串且长度大于6
b = Schema({Or("pwd", "password", only_one=True): And(str, lambda s: len(s) > 6)})
print(b.is_valid({"password": "abc"})) # False
print(b.is_valid({"pwd": "1234567"})) # True
print(b.is_valid({"pwd": "1234567", "password": "abc"})) # False
# 验证密码复杂度
from schema import Regex
c = Schema(Regex('^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,16}$')) # 必须包含大写字母,小写字母,数字,特殊字符四种中的三种,长度要求8到16位
print(c.is_valid('ABadsdd12'))