首页 > 编程语言 >Python学习笔记-Schema数据结构及类型校验

Python学习笔记-Schema数据结构及类型校验

时间:2023-11-21 09:01:50浏览次数:32  
标签:schema name Python money 校验 user Schema result

Python学习笔记-Schema数据结构及类型校验

使用 schema 库来执行数据结构的校验。schema 是一个简单而强大的库,用于定义和验证 Python 数据结构的约束

And

And 代表必选,数据结构里必须包含这个 schema,如下方声明了 name ,则代表这个name必须存在与字典中

from schema import Schema, And, SchemaError
user_schema = Schema([
    {
        "name": And(str)
    }
])
user_data_1 = [{
    "name": "jruing",
}]
user_data_2 = [{
    "name": 666,
}]
try:
    user_result_1 = user_schema.validate(user_data_1)
    print(f"数据校验user_result_1:{user_result_1}")
except SchemaError as e:
    print(f"数据校验异常user_result_1:{e}")

try:
    user_result_2 = user_schema.validate(user_data_2)
    print(f"数据校验user_result_2:{user_result_2}")
except SchemaError as e:
    print(f"数据校验异常user_result_2:{e}")
==========调用结果==========
数据校验user_result_1:[{'name': 'jruing'}]
数据校验异常user_result_2:Or({'name': And(<class 'str'>)}) did not validate {'name': 666}
Key 'name' error:
666 should be instance of 'str'

Or

Or 代表值的类型必须为某两个类型,比如intfloattuplelist

from schema import Schema, And, SchemaError, Or
user_schema = Schema([
    {
        "name": And(str),
        "money": Or(int,float)
    }
])
user_data_1 = [{
    "name": "jruing",
    "money": 1000,
}]
user_data_2 = [{
    "name": "jruing",
    "money": 1000.1,
}]
user_data_3 = [{
    "name": "jruing",
    "money": "1000.1",
}]
try:
    user_result_1 = user_schema.validate(user_data_1)
    print(f"数据校验user_result_1:{user_result_1}")
except SchemaError as e:
    print(f"数据校验异常user_result_1:{e}")

try:
    user_result_2 = user_schema.validate(user_data_2)
    print(f"数据校验user_result_2:{user_result_2}")
except SchemaError as e:
    print(f"数据校验异常user_result_2:{e}")

try:
    user_result_3 = user_schema.validate(user_data_3)
    print(f"数据校验user_result_3:{user_result_3}")
except SchemaError as e:
    print(f"数据校验异常user_result_3:{e}")
==========调用结果==========
数据校验user_result_1:[{'name': 'jruing', 'money': 1000, 'addr': '中国', 'country': '中国', 'email': '[email protected]'}]
数据校验异常user_result_2:Or({'name': And(<class 'str'>), 'money': Or(<class 'int'>, <class 'float'>), Optional('addr'): And(<class 'str'>), Optional('email'): And(<class 'str'>, Regex('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$', flags=re.IGNORECASE)), 'country': Const('中国')}) did not validate {'name': 'jruing', 'money': 1000.1, 'addr': '1111', 'country': '山西', 'email': '123456'}
Key 'country' error:
'中国' does not match '山西'

Const

Const 代表值必须为指定的某个常量,比如下面的 country必须为中国

import re

from schema import Schema, And, SchemaError, Or, Optional, Regex, Const

user_schema = Schema([
    {
        "name": And(str),
        "money": Or(int, float),
        Optional("addr"): And(str),
        Optional("email"): And(str, Regex(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', flags=re.I)),
        "country": Const("中国")

    }
])
user_data_1 = [{
    "name": "jruing",
    "money": 1000,
    "addr": "中国",
    "country": "中国",
    "email": "[email protected]"

}]
user_data_2 = [{
    "name": "jruing",
    "money": 1000.1,
    "addr": "1111",
    "country": "山西",
    "email": "123456"

}]

try:
    user_result_1 = user_schema.validate(user_data_1)
    print(f"数据校验user_result_1:{user_result_1}")
except SchemaError as e:
    print(f"数据校验异常user_result_1:{e}")

try:
    user_result_2 = user_schema.validate(user_data_2)
    print(f"数据校验user_result_2:{user_result_2}")
except SchemaError as e:
    print(f"数据校验异常user_result_2:{e}")
==========调用结果==========
数据校验user_result_1:[{'name': 'jruing', 'money': 1000, 'addr': '中国', 'country': '中国', 'email': '[email protected]'}]
数据校验异常user_result_2:Or({'name': And(<class 'str'>), 'money': Or(<class 'int'>, <class 'float'>), Optional('addr'): And(<class 'str'>), Optional('email'): And(<class 'str'>, Regex('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$', flags=re.IGNORECASE)), 'country': Const('中国')}) did not validate {'name': 'jruing', 'money': 1000.1, 'addr': '1111', 'country': '山西', 'email': '123456'}
Key 'country' error:
'中国' does not match '山西'

Optional

Optional 代表这个key或者元素为非必选,可有可无

from schema import Schema, And, SchemaError, Or, Optional

user_schema = Schema([
    {
        "name": And(str),
        "money": Or(int, float),
        Optional("addr"): And(str)

    }
])
user_data_1 = [{
    "name": "jruing",
    "money": 1000,
    "addr": "中国"

}]
user_data_2 = [{
    "name": "jruing",
    "money": 1000.1,

}]

try:
    user_result_1 = user_schema.validate(user_data_1)
    print(f"数据校验user_result_1:{user_result_1}")
except SchemaError as e:
    print(f"数据校验异常user_result_1:{e}")

try:
    user_result_2 = user_schema.validate(user_data_2)
    print(f"数据校验user_result_2:{user_result_2}")
except SchemaError as e:
    print(f"数据校验异常user_result_2:{e}")
==========调用结果==========
数据校验user_result_1:[{'name': 'jruing', 'money': 1000, 'addr': '中国'}]
数据校验user_result_2:[{'name': 'jruing', 'money': 1000.1}]

Use

Use 函数允许你在验证前对数据进行转换。这对于在验证之前对数据进行清理、格式化或其他操作非常有用。

import re

from schema import Schema, And, SchemaError, Or, Optional, Regex, Const, Use

user_schema = Schema([
    {
        "name": And(str),
        "money": Or(int, float),
        "age": Use(int),
        Optional("addr"): And(str),
        Optional("email"): And(str, Regex(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', flags=re.I)),
        Optional("country"): Const("中国")

    }
])
user_data_1 = [{
    "name": "jruing",
    "money": 1000,
    "age": 11,
    "addr": "中国",
    "country": "中国",
    "email": "[email protected]"

}]
user_data_2 = [{
    "name": "jruing",
    "money": 1000.1,
    "age": "18",
    "addr": "1111",
    "email": "[email protected]"

}]
user_data_3 = [{
    "name": "jruing",
    "money": 1000.1,
    "age": "fff",
    "addr": "1111",
    "email": "[email protected]"

}]
try:
    user_result_1 = user_schema.validate(user_data_1)
    print(f"数据校验user_result_1:{user_result_1}")
except SchemaError as e:
    print(f"数据校验异常user_result_1:{e}")

try:
    user_result_2 = user_schema.validate(user_data_2)
    print(f"数据校验user_result_2:{user_result_2}")
except SchemaError as e:
    print(f"数据校验异常user_result_2:{e}")
try:
    user_result_3 = user_schema.validate(user_data_3)
    print(f"数据校验user_result_3:{user_result_3}")
except SchemaError as e:
    print(f"数据校验异常user_result_3:{e}")
==========调用结果==========
数据校验user_result_1:[{'name': 'jruing', 'money': 1000, 'age': 11, 'addr': '中国', 'country': '中国', 'email': '[email protected]'}]
数据校验user_result_2:[{'name': 'jruing', 'money': 1000.1, 'age': 18, 'addr': '1111', 'email': '[email protected]'}]
数据校验异常user_result_3:Or({'name': And(<class 'str'>), 'money': Or(<class 'int'>, <class 'float'>), 'age': Use(<class 'int'>), Optional('addr'): And(<class 'str'>), Optional('email'): And(<class 'str'>, Regex('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$', flags=re.IGNORECASE)), Optional('country'): Const('中国')}) did not validate {'name': 'jruing', 'money': 1000.1, 'age': 'fff', 'addr': '1111', 'email': '[email protected]'}
Key 'age' error:
int('fff') raised ValueError("invalid literal for int() with base 10: 'fff'")

Regex

通过正则表达式,对值进行匹配校验,常用的就是邮箱,手机号等场景

import re

from schema import Schema, And, SchemaError, Or, Optional, Regex

user_schema = Schema([
    {
        "name": And(str),
        "money": Or(int, float),
        Optional("addr"): And(str),
        Optional("email"): And(str, Regex(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', flags=re.I))

    }
])
user_data_1 = [{
    "name": "jruing",
    "money": 1000,
    "addr": "中国",
    "email": "[email protected]"

}]
user_data_2 = [{
    "name": "jruing",
    "money": 1000.1,
    "addr": "1111",
    "email": "123456"

}]

try:
    user_result_1 = user_schema.validate(user_data_1)
    print(f"数据校验user_result_1:{user_result_1}")
except SchemaError as e:
    print(f"数据校验异常user_result_1:{e}")

try:
    user_result_2 = user_schema.validate(user_data_2)
    print(f"数据校验user_result_2:{user_result_2}")
except SchemaError as e:
    print(f"数据校验异常user_result_2:{e}")
==========调用结果==========
数据校验user_result_1:[{'name': 'jruing', 'money': 1000, 'addr': '中国', 'email': '[email protected]'}]
数据校验异常user_result_2:Or({'name': And(<class 'str'>), 'money': Or(<class 'int'>, <class 'float'>), Optional('addr'): And(<class 'str'>), Optional('email'): And(<class 'str'>, Regex('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$', flags=re.IGNORECASE))}) did not validate {'name': 'jruing', 'money': 1000.1, 'addr': '1111', 'email': '123456'}
Key 'email' error:
Regex('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$', flags=re.IGNORECASE) does not match '123456'

Forbidden

Forbidder 允许你定义一些不被允许的值,如果数据中包含这些值,验证将失败,下面的例子表示密码 password字段的值不允许设置为123456

import re

from schema import Schema, And, SchemaError, Or, Optional, Regex, Const, Use, Forbidden

user_schema = Schema([
    {
        "name": And(str),
        "money": Or(int, float),
        "age": Use(int),
        Optional("addr"): And(str),
        Optional("email"): And(str, Regex(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', flags=re.I)),
        Optional("country"): Const("中国"),
        "password": And(str, Forbidden("123456"))

    }
])
user_data_1 = [{
    "name": "jruing",
    "money": 1000,
    "age": 11,
    "addr": "中国",
    "country": "中国",
    "email": "[email protected]",
    "password": "123456"

}]
user_data_2 = [{
    "name": "jruing",
    "money": 1000.1,
    "age": "18",
    "addr": "1111",
    "email": "[email protected]",
    "password": "1234561"

}]

try:
    user_result_1 = user_schema.validate(user_data_1)
    print(f"数据校验user_result_1:{user_result_1}")
except SchemaError as e:
    print(f"数据校验异常user_result_1:{e}")

try:
    user_result_2 = user_schema.validate(user_data_2)
    print(f"数据校验user_result_2:{user_result_2}")
except SchemaError as e:
    print(f"数据校验异常user_result_2:{e}")
    
==========调用结果==========    
数据校验user_result_1:[{'name': 'jruing', 'money': 1000, 'age': 11, 'addr': '中国', 'country': '中国', 'email': '[email protected]', 'password': '123456'}]
数据校验异常user_result_2:Or({'name': And(<class 'str'>), 'money': Or(<class 'int'>, <class 'float'>), 'age': Use(<class 'int'>), Optional('addr'): And(<class 'str'>), Optional('email'): And(<class 'str'>, Regex('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$', flags=re.IGNORECASE)), Optional('country'): Const('中国'), 'password': And(<class 'str'>, Forbidden('123456'))}) did not validate {'name': 'jruing', 'money': 1000.1, 'age': '18', 'addr': '1111', 'email': '[email protected]', 'password': '1234561'}
Key 'password' error:
'123456' does not match '1234561'

标签:schema,name,Python,money,校验,user,Schema,result
From: https://www.cnblogs.com/jruing/p/17845434.html

相关文章

  • Python中的UnboundLocalError是什么错误?如何解决?
    在一个月黑风高的夜晚,我们满心欢喜地写出以下代码:money=10000#当前的财产,单位为元defadd_money(value):money+=valueprint('当前财产:',money)add_money(10)print('当前财产:',money)以上代码中,定义了函数add_money,将money增加value.我们期待着运行......
  • Python小白入门指南:避免踩雷的10大错误!
    hello,大家好!新手小白踏入Python的大门有点像冒险,但别担心,我已经整理了一个超实用的入门指南,帮你规避学习过程中的十大雷区。这里有关于Python的错误你应该注意的建议,一起来看看吧!1.拼写错误小心prin和print的奇妙之旅!#错误示例prin("Hello,World!")#建议:尽量保......
  • input如何校验数字为正整数位数与小数位数
    1.表单中内容为<el-form><el-form-item:prop="minPrice":rules="{required:true,validator:PriceValidator,trigger:'blur',}"><el-inputtype="Number"min="1"v-model="......
  • Python——第三章:函数的定义
    函数:对某一个特定的功能或者代码块进行封装.在需要使用该功能的时候直接调用即可定义:def函数的名字():被封装的功能或者代码块->函数体调用:函数的名字()好处:让程序更加简洁.代码更加合理defbuy_cai():#定义函数print("1.打车")print("2.去菜......
  • 1688 商品详情 APIERP 选品专用 API 接口 Python Java
    1688商品详情API接口是一种程序化的接口,它允许商家或开发者使用自己的编程技能,对1688平台上的商品信息进行查询、获取和更新。通过这个API接口,商家可以根据自己的需求,获取商品的详细信息,如价格、库存、描述、图片等,从而更好地进行营销和客户服务。使用1688商品详情API接......
  • python的迭代器:如何使用Python迭代器来提高编程效率
    Python的迭代器是一种特殊的对象,它可以用来遍历可迭代对象(如列表、字典、元组)中的元素。它通过实现__iter__()和__next__()方法来实现迭代器功能,并使用next()函数来获取下一个元素。Python的迭代器是一种特殊的对象,它可以用来遍历可迭代对象(如列表、字典、元组)中的元素。它通......
  • python之代理ip的配置与调试
    前言代理IP是网络爬虫中常用的技术手段。通过使用代理服务器,可以实现对特定网站的访问次数限制、避免IP封锁等问题。本文将介绍Python中代理IP的配置与调试方法,并附带代码实例。一、代理IP的配置Python中使用代理IP需要使用requests库,而requests库中则需要设置proxies参数。proxies......
  • Centos7 使用yum从第三方仓库安装Python3.8
    环境:CentOSLinuxrelease7.9.2009起因:Centos7自带Python2.7.5版本。而默认的YUM安装的python3是3.6版本,遂升级到3.8版本。installPython3.8yuminstall-ycentos-release-scl#仓库注册yuminstall-yrh-python38which#安装python3.8#创建软连接ln-s/opt......
  • python处理Excel文件的导入
    处理的文件:label.xlsxAPIDGroupBorrower【HoldingCompanyID】GroupBorrower【TypeofCompany】Watermark3.0(Migrationclientonly)【EffectiveDate】12681974Affiliate 17411268HoldingCompany 18902073Affiliate2023/12/3019552136......
  • python处理数据的导出到Excel
    importdatetimeimportjsonimportosimportpandasaspdfromsqlalchemyimportcreate_enginefromsqlalchemy.sqlimporttext#数据库连接配置,请根据你的实际情况修改db_config={'host':'your_database_host','user':'your_data......