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

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。

原文链接:schema,一个非常实用的 Python 库!

大家好,今天为大家分享一个非常实用的 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项目中。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值