高级验证
全面的验证策略
基于装饰器的验证
def validate_type(expected_type):
def decorator(func):
def wrapper(self, value):
if not isinstance(value, expected_type):
raise TypeError(f"期望的类型是 {expected_type.__name__},得到的类型是 {type(value).__name__}")
return func(self, value)
return wrapper
return decorator
class StrictUser:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
@validate_type(str)
def name(self, value):
if len(value) < 2:
raise ValueError("名字必须至少有2个字符")
self._name = value
验证工作流程
flowchart TD
A[接收到输入] --> B{类型检查}
B --> |通过| C{范围验证}
B --> |失败| D[类型错误]
C --> |通过| E{自定义规则}
C --> |失败| F[值错误]
E --> |通过| G[设置值]
E --> |失败| H[自定义异常]
高级验证技术
技术 |
描述 |
示例用例 |
类型检查 |
确保数据类型正确 |
表单输入 |
范围验证 |
限制值的边界 |
数值约束 |
模式匹配 |
验证字符串格式 |
电子邮件、电话号码 |
依赖验证 |
跨字段验证 |
密码确认 |
复杂验证示例
class ComplexPassword:
def __init__(self):
self._password = None
@property
def password(self):
return self._password
@password.setter
def password(self, value):
## 全面的密码验证
if not isinstance(value, str):
raise TypeError("密码必须是字符串")
if len(value) < 8:
raise ValueError("密码必须至少有8个字符")
import re
## 检查是否有大写字母
if not re.search(r'[A-Z]', value):
raise ValueError("密码必须至少包含一个大写字母")
## 检查是否有小写字母
if not re.search(r'[a-z]', value):
raise ValueError("密码必须至少包含一个小写字母")
## 检查是否有数字
if not re.search(r'\d', value):
raise ValueError("密码必须至少包含一个数字")
## 检查是否有特殊字符
if not re.search(r'[!@#$%^&*(),.?":{}|<>]', value):
raise ValueError("密码必须至少包含一个特殊字符")
self._password = value
验证组合
class UserProfile:
def __init__(self):
self._age = None
self._email = None
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise TypeError("年龄必须是整数")
if value < 18 or value > 120:
raise ValueError("无效的年龄范围")
self._age = value
@property
def email(self):
return self._email
@email.setter
def email(self, value):
import re
email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
if not re.match(email_regex, value):
raise ValueError("无效的电子邮件格式")
self._email = value
最佳实践
- 实现多层验证
- 提供清晰、具体的错误消息
- 使用类型提示和文档字符串
- 考虑性能影响
LabEx 建议实践这些高级验证技术,以创建更健壮、安全的 Python 应用程序。