自定义验证函数
创建可重用的验证函数处理复杂验证逻辑。
def validate_user_input(input_data):
# 检查类型
if not isinstance(input_data, dict):
raise TypeError("输入必须是字典")
# 检查必要字段
required_fields = ['username', 'email', 'age']
for field in required_fields:
if field not in input_data:
raise ValueError(f"缺少必要字段: {field}")
# 检查字段类型
if not isinstance(input_data['username'], str):
raise TypeError("用户名必须是字符串")
if not isinstance(input_data['email'], str) or '@' not in input_data['email']:
raise TypeError("邮箱格式不正确")
if not isinstance(input_data['age'], int) or input_data['age'] < 18:
raise TypeError("年龄必须是大于等于18的整数")
return True
# 测试用例
valid_data = {
'username': 'john_doe',
'email': 'john@example.com',
'age': 30
}
print(validate_user_input(valid_data)) # 返回 True
invalid_data = {'username': 'jane', 'age': '25'}
# 将抛出异常
使用装饰器进行类型检查
装饰器可以在不修改函数逻辑的情况下添加类型检查功能。
def typecheck(**types):
def decorator(func):
def wrapper(*args, **kwargs):
# 检查位置参数
for i, (arg, (name, expected_type)) in enumerate(zip(args, types.items())):
if not isinstance(arg, expected_type):
raise TypeError(f"参数 '{name}' 应该是 {expected_type.__name__}, 实际是 {type(arg).__name__}")
# 检查关键字参数
for name, value in kwargs.items():
if name in types and not isinstance(value, types[name]):
raise TypeError(f"参数 '{name}' 应该是 {types[name].__name__}, 实际是 {type(value).__name__}")
return func(*args, **kwargs)
return wrapper
return decorator
# 使用装饰器
@typecheck(name=str, age=int, scores=list)
def create_user(name, age, scores=None):
print(f"创建用户: {name}, {age}岁")
if scores:
print(f"分数: {scores}")
# 测试
create_user("Alice", 25, [85, 90, 78]) # 正常执行
create_user("Bob", "30") # 抛出TypeError
发表评论