社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

schema,一个非常实用的 Python 库!

python • 6 天前 • 37 次点击  

点击上方卡片关注我

设置星标 学习更多技能

大家好,今天为大家分享一个非常实用的 Python 库 - schema。

Github地址:https://github.com/keleshev/schema


在现代软件开发中,数据验证是确保应用程序稳定性和安全性的重要环节。Python Schema库是一个轻量级且功能强大的数据验证框架,它提供了直观简洁的语法来定义和验证复杂的数据结构。与传统的手动验证方式相比,Schema库采用声明式的方法,让开发者能够用极少的代码表达复杂的验证逻辑。

安装

1、安装方法

Schema库可以通过pip包管理器快速安装:

pip install schema

对于需要正则表达式增强功能的用户,可以安装完整版本:

pip install schema[validation]

2、验证安装

安装完成后,可以通过以下代码验证安装是否成功:

from schema import Schema, And, Use, Optional
import schema

# 检查版本信息
print(f"Schema库版本: {schema.__version__}")

# 创建简单验证示例
simple_schema = Schema({'name': str, 'age': int})
test_data = {'name''Alice''age'25}
result = simple_schema.validate(test_data)
print(f"验证成功: {result}")

主要特性

  • 声明式语法:使用简洁直观的语法定义验证规则,代码可读性极高
  • 组合验证器:支持And、Or、Use等逻辑组合,构建复杂验证条件
  • 类型检查:内置常用数据类型验证,支持自定义类型检查
  • 正则表达式支持:原生支持正则表达式验证字符串格式
  • 可选字段处理:灵活处理可选字段和默认值设置
  • 嵌套结构验证:支持深层嵌套的字典和列表结构验证
  • 错误信息定制:提供详细的错误信息和自定义错误消息
  • 轻量级设计:无外部依赖,性能优异,适合各种规模的项目

基本功能

1、基础数据类型验证

Schema库最基本的功能是验证数据类型,它支持Python的所有内置类型,包括字符串、数字、布尔值等。通过简单的字典定义,就能创建出强大的验证规则。

from schema import Schema, SchemaError

# 定义基础验证规则
user_schema = Schema({
    'username': str,
    'age': int,
    'email': str,
    'is_active': bool,
    'score': float
})

# 正确的数据
valid_data = {
    'username''john_doe',
    'age'28,
    'email''john@example.com',
    'is_active'True,
    'score'95.5
}

try:
    result = user_schema.validate(valid_data)
    print("验证成功:", result)
except SchemaError as e:
    print("验证失败:", e)

# 错误的数据示例
invalid_data = {'username''jane''age''25''email''jane@example.com'}
try:
    user_schema.validate(invalid_data)
except SchemaError as e:
    print("类型错误:", e)

2、可选字段和默认值

在实际应用中,许多字段并非必需的,Schema库提供了Optional装饰器来处理可选字段。同时还支持设置默认值,当字段缺失时自动填充。

from schema import Schema, Optional, Use

# 定义包含可选字段的规则
profile_schema = Schema({
    'name': str,
    'email': str,
    Optional('age', default=18): int,
    Optional('country', default='Unknown'): str,
    Optional('hobbies', default=[]): list,
    Optional('phone'): str  # 可选但无默认值
})

# 测试不完整的数据
incomplete_data = {
    'name''Alice',
    'email''alice@example.com'
}

try:
    result = profile_schema.validate(incomplete_data)
    print("验证结果:", result)
    print(f"默认年龄: {result['age']}")
    print(f"默认国家: {result['country']}")
except SchemaError as e:
    print("验证失败:", e)

# 包含可选字段的完整数据
complete_data = {
    'name''Bob',
    'email''bob@example.com',
    'age'30,
    'country''USA',
    'phone''+1-555-0123'
}

validated = profile_schema.validate(complete_data)
print("完整数据验证:", validated)

3、数据转换和清理

Schema库的Use装饰器不仅能验证数据,还能在验证过程中对数据进行转换和清理,通过链式调用多个转换函数,可以实现复杂的数据预处理逻辑。

from schema import Schema, Use, And
import re

# 定义数据转换和验证规则
registration_schema = Schema({
    'username': Use(str.lower),  # 转换为小写
    'email': And(Use(str.strip), Use(str.lower)),  # 去空格并转小写
    'age': Use(int),  # 字符串转整数
    'phone': Use(lambda x: re.sub(r'\D''', x)),  # 只保留数字
    'tags': Use(lambda x: [tag.strip() for tag in x.split(',')]),  # 分割并清理标签
    'bio': Use(str.strip)  # 去除首尾空格
})

# 需要清理的原始数据
raw_data = {
    'username''JohnDoe123',
    'email''  JOHN@EXAMPLE.COM  ',
    'age''25',
    'phone''+1 (555) 123-4567',
    'tags''python, web development, data science',
    'bio''  Software developer with 5 years experience  '
}

try:
    cleaned_data = registration_schema.validate(raw_data)
    print("清理后的数据:")
    for key, value in cleaned_data.items():
        print(f"  {key}{value} ({type(value).__name__})")
except SchemaError as e:
    print( "数据清理失败:", e)

高级功能

1、复杂验证条件和正则表达式

Schema库支持使用And、Or组合多个验证条件,还可以结合正则表达式进行复杂的字符串格式验证。

from schema import Schema, And, Or, Regex, Use
import re

# 定义复杂验证规则
account_schema = Schema({
    'username': And(
        str,
        lambda x: len(x) >= 3,  # 至少3个字符
        lambda x: len(x) <= 20,  # 最多20个字符
        Regex(r'^[a-zA-Z0-9_]+$'),  # 只能包含字母、数字、下划线
        error='用户名格式不正确'
    ),
    'password': And(
        str,
        lambda x: len(x) >=  8,  # 至少8位
        lambda x: re.search(r'[A-Z]', x),  # 包含大写字母
        lambda x: re.search(r'[a-z]', x),  # 包含小写字母
        lambda x: re.search(r'\d', x),  # 包含数字
        lambda x: re.search(r'[!@#$%^&*]', x),  # 包含特殊字符
        error='密码强度不足'
    ),
    'email': Regex(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'),
    'age': And(int, lambda x: 13 <= x <= 120),  # 年龄范围
    'role': Or('admin''user''guest'),  # 枚举值
    'score': And(Or(int, float), lambda x: 0 <= x <= 100)  # 分数范围
})

# 测试复杂验证
test_account = {
    'username''john_doe123',
    'password''SecurePass123!',
    'email''john.doe@example.com',
    'age'25,
    'role''user',
    'score'85.5
}

try:
    validated_account = account_schema.validate(test_account)
    print("账户验证成功:", validated_account)
except SchemaError as e:
    print("账户验证失败:", e)

2、嵌套结构和列表验证

在处理JSON API或复杂配置文件时,经常需要验证嵌套的数据结构。Schema库提供了强大的嵌套验证能力,可以定义多层次的验证规则,包括嵌套字典、对象列表、混合结构等。

from schema import Schema, And, Use, Optional

# 定义嵌套结构验证规则
order_schema = Schema({
    'order_id': And(str, len),
    'customer': {
        'name': str,
        'email': Regex(r'^[^@]+@[^@]+\.[^@]+$'),
        'address': {
            'street': str,
            'city': str,
            'country': str,
            'postal_code': str
        }
    },
    'items': [
        {
            'product_id': And(str, len),
            'name': str,
            'quantity': And(int, lambda x: x > 0),
            'price': And(Or(int, float), lambda x: x >= 0),
            Optional('discount', default=0): And(Or(int, float), lambda x: 0 <= x <= 1)
        }
    ],
    'total_amount': And(Or(int, float), lambda x: x >= 0),
    'status': Or('pending''confirmed''shipped''delivered'),
    Optional('notes'): str
})

# 复杂的嵌套数据
order_data = {
    'order_id''ORD-2024-001',
    'customer': {
        'name''Alice Johnson',
        'email''alice@example.com',
        'address': {
            'street''123 Main St',
            'city''New York',
            'country''USA',
            'postal_code''10001'
        }
    },
    'items': [
        {
            'product_id''PROD-001',
            'name''Python编程书籍',
            'quantity'2,
            'price' 29.99,
            'discount'0.1
        },
        {
            'product_id''PROD-002',
            'name''数据结构教程',
            'quantity'1,
            'price'39.99
        }
    ],
    'total_amount'89.97,
    'status''confirmed'
}

try:
    validated_order = order_schema.validate(order_data)
    print("订单验证成功")
    print(f"客户: {validated_order['customer']['name']}")
    print(f"商品数量: {len(validated_order['items'])}")
    print(f"总金额: ${validated_order['total_amount']}")
except SchemaError as e:
    print("订单验证失败:", e)

总结

Python Schema库以其简洁优雅的设计和强大的功能,成为了数据验证领域的优秀解决方案。从基础的类型检查到复杂的嵌套结构验证,Schema都提供了直观易用的API。其声明式的语法让验证规则一目了然,大大提高了代码的可读性和可维护性。Schema库的组合验证器、数据转换、正则表达式支持等特性,使其能够应对各种复杂的验证需求。无论是API参数验证、配置文件检查,还是用户输入过滤,Schema都能提供可靠的解决方案。其轻量级的设计和零依赖的特点,让它可以轻松集成到任何Python项目中。


AI时代,AI工具的成熟,让程序员有了以前不敢想象的能力。海外市场的广阔,给了我们更大的舞台。

如果你也在考虑新的出路,如果你也想尝试AI编程出海这个方向,欢迎加入我们。

扫码或搜索 257735 添加微信,发送暗号「美金」,了解详细信息。

图片

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/186014
 
37 次点击